我正在尝试使用PHP访问第三方API。
它们的命令参考如下:
curl "https://api.example.com/api/" '
-H "Authorization: BEARER-TOKEN" '
-F 'data={"language":"EN","latitude":12.345,"longitude":12.345}'
我试过:
$url = 'https://api.example.com/api/';
$header = array(
'Content-type: application/json',
'Authorization: ' . $bearertoken
);
$fields = 'data={"language":"EN","latitude":"'.$latitude.'","longitude":"'.$longitude.'"}';
// I've tried this too:
$fields = array('data' => '{"language":"EN","latitude":"'.$latitude.'","longitude":"'.$longitude.'"}');
$ch = curl_init();
$options = array(
CURLOPT_URL => $url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $fields,
CURLOPT_HTTPHEADER => $header,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => false,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 10,
CURLOPT_ENCODING => "",
CURLOPT_AUTOREFERER => true,
CURLOPT_CONNECTTIMEOUT => 120,
CURLOPT_TIMEOUT => 120
);
curl_setopt_array($ch, $options);
$result = curl_exec($ch);`
但是服务器响应一条消息,告诉我它没有得到我发送的参数。当我从终端发送相同的-F "data={}"
时,我得到了正确的响应。
你不应该使用Content-type: application/json
。data
参数的值为JSON,但整体以application/x-www-form-urlencoded
格式发送。
还需要对data
参数的值进行url编码。
最好的解决方案是使用json_encode
创建JSON值,然后使用post字段数组,然后curl
将正确编码字段。
$header = array(
'Authorization: ' . $bearertoken
);
$fields = array('data' =>
json_encode(array('language' => 'EN',
'longitude' => $longitude,
'latitude' => $latitude)));
curl -F
按照RFC 2388使用Content-Type: multipart/form-data
提交表单。当你设置application/json
内容类型时,你特别违反了这一点。
$data = array('language' => 'EN', 'longitude' => $longitude, 'latitude' => $latitude);
$headers = array (
"Content-Type: multipart/form-data",
"Authorization: $bearertoken",
);
$postfields = array ("data" => json_encode($data));
$ch = curl_init();
$options = array(
CURLOPT_URL => $url,
CURLOPT_HEADER => true,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postfields,
CURLOPT_RETURNTRANSFER => true
);
curl_setopt_array($ch, $options);
curl_exec($ch);
同样,如果这是实际的文档,它可能是错误的。授权头的格式为Authorization: Bearer <token>