curl -F "data={json:'code'}" in PHP?


curl -F "data={json:'code'}" in PHP?

我正在尝试使用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/jsondata参数的值为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>