我可以使用PHP / CURL同时发布JSON正文和POST值吗?

时间:2014-09-21 03:31:09

标签: php json post curl

我有一个Web服务,它接受GET,POST值作为参数。到目前为止,我曾使用简单的CURL脚本调用数据,如下所示:

http://localhost/service/API.php?key=some_password&request=some_request&p1=v1&p2=v2

使用“CURLOPT_POSTFIELDS”成功发布:

    $base_args = array(
        'key' => 'some_password',
        'request' => 'some_request',
    );

    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");   
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);

问题是,我还需要将JSON主体POST到此服务。我发现这可以通过使用“CURLOPT_POSTFIELDS”来完成,但也发现我无法同时使用POST和JSON。

$data_string ="{'test':'this is a json payload'}";

$ch = curl_init('http://localhost/service/API.php');

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");   
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',    
'Content-Length: ' . strlen($data_string)));

$result = curl_exec($ch);
echo ($result); // string returned by the service.

我既可以设置POST值,也可以设置JSON正文,但不能同时设置两者。有没有办法可以推动两种不同类型的价值观?

2 个答案:

答案 0 :(得分:2)

尝试通过变量发送json文本:

$data = array('data' => "{'test':'this is a json payload'}", 'key' => 'some_password', 'request' => 'some_request');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));

然后在您的API中执行:

var_dump(json_decode($_POST['data']));

您仍然可以使用其他键/请求变量。

答案 1 :(得分:0)

我找不到任何同时发送POST和JSON主体的方法。因此,解决方法是将POST参数添加为JSON正文的一部分。

$base_args = array(
    'key' => '8f752Dd5sRF4p',
    'request' => 'RideDetails',
    'data' => '{\'test\',\'test\'}',
);

$ch = curl_init('http://localhost/service/API.php');                                                                      

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");   
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($base_args));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($ch, CURLOPT_HTTPHEADER,    array(                                                                          
'Content-Type: application/json',                                                                         
'Content-Length: ' . strlen(http_build_query($base_args)))  

);

$result = curl_exec($ch);
echo ($result);

API可以返回完整的JSON,如下所示:

var_dump(json_decode(file_get_contents('php://input')));