cURL post PHP 失败

cURL post with PHP failing

使用 Postman,我已经能够成功地创建一个 API 调用来从网络服务器检索信息。

然而,我对 PHP 做同样的事情却没有成功。以下是我试图在 PHP.

中复制的 Postman 的一些屏幕截图

这是我的 PHP 代码 -

$filters = array("1234", "28");
$selectors = array("Brand", "Name");

$body = array('Filter' => array('SKU'=>$filters, 'OutputSelector' => $selectors));

$url = "https://xyz.neto.com.au/do/WS/NetoAPI";

$method = "POST";
$headers = array(
    "NETOAPI_ACTION: GetItem",
    "NETOAPI_KEY: xxxxxxx",
    "Accept: application/json",
    "NETOAPI_USERNAME: puneeth"     
);    

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($ch);
$err = curl_error($ch);

curl_close($ch);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response;
}

P.S 我故意把 url 和密钥搞砸了。

我正在尝试按照此处概述的说明进行操作 - https://developers.neto.com.au/documentation/engineers/api-documentation/products/getitem

一些可能会阻止您的代码工作的事情:

1。数组到字符串的转换

您已将请求的 body 声明为 $body 中的数组。在将其传递给 cURL 之前,您需要 JSON-encode 它:

$body = array('Filter' => array('SKU'=>$filters, 'OutputSelector' => $selectors));
$bodyJSON = json_encode($body);
[...]
curl_setopt($ch, CURLOPT_POSTFIELDS, $bodyJSON);

2。 HTTPS 请求

如果您收到空响应,您还需要为 SSL 通信配置 cURL。一个快速解决方法是忽略远程服务器证书有效性:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

虽然这可行,但请参阅 this answer 以获得更好的解决方案。

3。缺少 Content-Type

发送原始后域时,一些服务器需要知道您发送的数据类型。这是通过设置 Content-Type header:

$headers = array(
    "Content-Type: application/json",
    [...]     
);