пост cURL с ошибкой PHP - PullRequest
0 голосов
/ 24 июня 2018

Используя Postman, я смог успешно создать вызов API для получения информации с веб-сервера.

Однако мне не удалось сделать то же самое с PHP.Ниже приведены несколько скриншотов из Почтальона, которые я пытаюсь воспроизвести на PHP.

enter image description here enter image description here

Это мой 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;
}

PS Я умышленно выдумал URL и ключ.

Я пытаюсь следовать инструкциям, изложенным здесь - https://developers.neto.com.au/documentation/engineers/api-documentation/products/getitem

1 Ответ

0 голосов
/ 24 июня 2018

Мало что может помешать работе вашего кода:

1. Преобразование массива в строку

Вы объявили тело запроса в виде массива в $body. Вам нужно JSON-кодировать его перед передачей в cURL:

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

2. HTTPS-запрос

Если вы получаете пустой ответ, вам также необходимо настроить cURL для связи SSL. Быстрое решение этой проблемы - игнорировать действительность сертификата удаленного сервера:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Хотя это работает, см. этот ответ для лучшего решения.

3. Отсутствует тип контента

При отправке необработанных пост-полей некоторые серверы должны знать, какой тип данных вы отправляете. Это делается путем установки заголовка Content-Type:

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