如何使用内容类型为“quot”的PHP curl发送原始JSON;应用程序/x-www-form-urlencoded“;?

如何使用内容类型为“quot”的PHP curl发送原始JSON;应用程序/x-www-form-urlencoded“;?,php,json,post,curl,raw-post,Php,Json,Post,Curl,Raw Post,如何使用内容类型为application/x-www-form-urlencoded的PHP curl发送原始JSON 让我解释一下: 我正在与一个Web服务器通信,该服务器接受带有JSON对象的HTTPPOST请求,作为请求主体,通常我们习惯于查看HTTP查询参数 在我的情况下,我需要发送具有以下内容类型的请求 内容类型:application/x-www-form-urlencoded 正文必须是原始JSON 因此,有很多可能性。我尝试了以下方法: <?php $serve

如何使用内容类型为
application/x-www-form-urlencoded
的PHP curl发送原始JSON

让我解释一下:

我正在与一个Web服务器通信,该服务器接受带有JSON对象的HTTPPOST请求,作为请求主体,通常我们习惯于查看HTTP查询参数

在我的情况下,我需要发送具有以下内容类型的请求

内容类型:application/x-www-form-urlencoded

正文必须是原始JSON

因此,有很多可能性。我尝试了以下方法:

<?php
      $server_url = "http://server.com";
      $curl = curl_init($server_url);
      $data_array = array("a"=> "a_val", "b" => array("c"=>"c_val", "d"=>"d_val") );

 $options = array(
       CURLOPT_POST            => TRUE,
       CURLOPT_HTTPHEADER     => array('Content-Type: application/x-www-form-urlencoded'),
       CURLOPT_POSTFIELDS      => json_encode($data_array),
       CURLOPT_COOKIEJAR       => realpath('tmp/cookie.txt'),
       CURLOPT_COOKIEFILE      => realpath('tmp/cookie.txt')
        );

    curl_setopt_array($curl, $options);
    $return = curl_exec($curl);  
    var_dump($return);  
    curl_close($curl);
?>
如果服务器能够解析html参数,我可以这样做:

...    
CURLOPT_POSTFIELDS      => http_build_query($data_array)
...
然而,事实并非如此,我需要一个变通办法


请注意,更改内容类型无效。我尝试使用
text/plain
,但服务器不接受它。

通常
应用程序/x-www-form-urlencoded
需要一个键值对HTTP post参数。因此,在没有看到POST数据格式示例的情况下,很难向您提出任何建议。根据文档,您必须将URL编码的数据与变量一起放置。例如,JSON应该是这样的

$post_data = "data=".urlencode(json_encode($data_array))
您可以尝试在没有任何关键参数的情况下发送数据,但它不应该工作

$post_data = urlencode(json_encode($data_array))

我不完全确定我是否理解你的问题,所以我将回答两个不同的版本

发送JSON数据,但使用(不准确的)
应用程序/x-www-form-urlencoded
内容类型 我不知道你为什么想这么做,但如果你想这么做,那应该相当简单

$data_array = array(
    'a' => 'a_val',
    'b' => array(
        'c' => 'c_val',
        'd' => 'd_val'
    )
);

$json = json_encode($data_array);

$c = curl_init();
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_USERAGENT, 'PHP/' . phpversion());
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $json);
curl_setopt($c, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
$result = curl_exec($c);
if (curl_errno($c)) {
    return trigger_error('CURL error [' . curl_errno($c) . '] ' . curl_error($c));
}
curl_close($c);

echo $result;
请记住,您在这里故意向服务器发送不准确的数据。您正在发送JSON,但称之为urlencoded。你可能不想这样做;如果,出于某种原因,您确实需要这样做,那么您最好解决真正的问题,而不是使用这种黑客解决方法

如果你用的是口吻而不是卷发,可能会有点棘手。Guzzle内置了对JSON和urlencoded的支持,但如果你想这样胡闹,最好不要使用它。自己生成JSON数据(使用
$JSON=JSON\u encode($data)
),并手动在Guzzle中设置内容类型

发送URL编码的JSON数据 这是一个奇怪的设置,但准确。至少你不会在你的HTTP头上撒谎

基本上与上述相同,但添加以下内容:

$json = json_encode($data_array);
$data = array('JSON' => $json);
$body = http_build_query($data);
然后将
CURLOPT_POSTFIELDS
设置为
$body
,而不是
$json

您可能真正应该做的是:将JSON作为JSON发送。 在大多数情况下,最好发送JSON数据(如示例一),并将内容类型设置为
application/JSON
。这是一个比示例2更小的数据大小(urlencoding步骤增加了数据的大小),并且它具有准确的头数据

$json = json_encode($data_array);
$data = array('JSON' => $json);
$body = http_build_query($data);