Почему PHP cURL PUT-запрос не работает, несмотря на получение кода состояния 200 взамен? - PullRequest
2 голосов
/ 15 марта 2019

Я застрял с этой проблемой на некоторое время.Я пытаюсь использовать REST API для изменения определенных настроек пользователя, таких как очистка пользователя и установка его устройства в неактивное состояние.

REST-вызовы сделаны в php, к которому я довольно новичок.Большинство вызовов (get и post) работают просто отлично, поэтому я думаю, что понял основную концепцию php и curl, но просто не могу заставить работать запросы put.Проблема в том, что при вызове REST я получаю взамен код состояния 200, указывающий, что все прошло нормально, но когда я проверяю базу данных, ничего не изменилось, и устройство все еще активно.

Я потратил несколько часов на исследование этой проблемы здесь на stackexchange ( Запрос cURL PUT не работает с PHP , Php Curl возвращает 200, но не публикует , Функция PHP CURL PUT не работает ) и дополнительно читает различные учебные пособия.Для меня мой код выглядит хорошо и имеет смысл, как и многие примеры, которые я нашел в Интернете.Поэтому, пожалуйста, помогите мне найти мою ошибку.

$sn = "123456789";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com/api/sn/".$sn);

$data = array("cmd" => "clearUser");
$headers = array(
    'Accept: application/json',
    'Content-Type: application/json'
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$username = 'XXX';
$password = 'XXX';
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($data));

$output = curl_exec($ch);
curl_close($ch);

Ответы [ 3 ]

0 голосов
/ 15 марта 2019

статус 200 может не быть успешным в случае запроса PUT.В правильной семантике (правильная реализация сервера) успешное PUT возвращает «201 Created», и, если клиент отправляет пустой или какой-то неверный контент, сервер возвращает «204 No Content».

Ленивые программисты могут просто вернуться«200 Ok» вместо 204 со значением «ваш запрос в порядке, но данные не имеют ничего общего».

Попробуйте проверить свои данные и убедиться, что вы отправили что-то не пустое исоответствует спецификации API.

0 голосов
/ 15 марта 2019

Насколько я вижу, у вас две проблемы в вашем коде.

  1. Content-Type: application/json неверно, я бы удалил его полностью.
  2. У вас нетContent-Length заголовок.

Я предлагаю попробовать

$sn = "123456789";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com/api/sn/".$sn);

$data = array("cmd" => "clearUser");
$httpQuery = http_build_query($data);
$headers = array(
    'Accept: application/json',
    'Content-Length: ' . strlen($httpQuery)
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$username = 'XXX';
$password = 'XXX';
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POSTFIELDS,$httpQuery);

$output = curl_exec($ch);
curl_close($ch);
0 голосов
/ 15 марта 2019

Вы определяете в заголовке «Content-Type: application / json». Попробуйте закодировать ваши $ data в json, а затем передать jsonEncodeteData:

$dataJson = json_encode($data);
curl_setopt($ch, CURLOPT_POSTFIELDS, $dataJson);

возможно, это уже помогает.

...