我有一个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正文,但不能同时设置两者。有没有办法可以推动两种不同类型的价值观?
答案 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')));