以正确的方式在cURL中发出HTTP请求

时间:2018-10-24 10:15:56

标签: php json http curl

我正在通过Curl传递数据,如下所示,由于我无法正常工作,看来我做错了什么。...请指导我如何正确提出请求。

下面是完整代码:

<?php

$url = 'https://staging.logistics.com/v2/shipments/create';

$data = '
"request_id" : "10",
 "value": "false"
';

$data_string = json_encode(array(
    "customer" => $data
));

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type:application/json'
));

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
     "Authorization: Basic ZcnM6ZHV55tbXlLZXk="
);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);

curl_close($ch);

echo "$result";
?>

我收到此HTTP错误:

  

415访问/ v2 / shipments / create时出现问题。原因:不支持的媒体   输入

2 个答案:

答案 0 :(得分:1)

“不支持的媒体类型”错误是因为您没有发送有效的JSON。由于将$data创建为字符串,然后将其json_encode()创建为字符串,因此最终将获得服务器无法识别的双重编码数据。问题中显示的代码将导致$data_string输出为

{"customer":"\r\n\"request_id\" : \"10\",\r\n \"value\": \"false\"\r\n"}

此版本的可用版本是

{"customer": { "request_id" : "10", "value": "false" } }

要实现这一点,您需要编写代码,方法是制作一个PHP对象/数组,然后对该对象进行编码:

$data = array("request_id" => "10", "value" => "false");

$data_string = json_encode(array(
    "customer" => $data
));

Here's a demo显示了上面代码的输出。

您还可以将代码缩短为:

$data = array( 
  "customer" => array(
    "request_id" => "10", 
    "value" => "false")
  )
);
$data_string = json_encode($data);

您的错误是将PHP代码中的数据创建与文本传输格式(在这种情况下为JSON)编码混淆。相反,您需要使用(嵌套的)关联数组和常规数组在PHP中创建数据,以便将其传递给json_encode()时,输出有效载荷采用API要求的正确格式。

答案 1 :(得分:0)

尝试将令牌连接到curl选项,像这样

 curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: ' . $your_token));