PHP: Как отправить «JSON» с помощью метода PUT?

Я делаю (и тестирую) свой небольшой PHP API. Оба метода GET / POST отлично работают при передаче JSON виде данных.

Проблема в PUT

  • Я не могу отправить данные JSON через метод PUT . Когда я это делаю, серверная сторона получает пустые данные.
  • Но когда я НЕ использую json качестве типа данных (и просто использую простые текстовые данные), я могу получить и проанализировать данные успешно . <—- ((Это что-то странное!))

Вот мои проверенные случаи.

Сторона клиента (материалы)

(Отправить через PHP) submit.php:

 $data = array("fruit"=>"watermelon", "destination"=>"germany"); $data = json_encode($data); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.example.com/api.php"); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Content-Length: ' . strlen($data))); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $respond = curl_exec($ch); curl_close($ch); print_r($respond); 

(Отправить через Почтальон):

введите описание изображения здесь

Сторона сервера (прием / анализ)

api.php:

 $decoded_input = json_decode(file_get_contents("php://input"), true); parse_str($decoded_input, $putdata); header('Content-type: application/json'); echo json_encode( $putdata ); 

Вывод

 [] 

Вопрос

Похоже, что получение / разбор на стороне сервера – проблема .

  • Как отправить тип данных JSON с помощью метода PUT?
  • Существуют ли какие-либо настройки на моей стороне сервера ( Apache + PHP ), чтобы включить (разрешить) тип данных json в методе PUT ?

** Я просто не могу получить JSON работает через метод PUT. Спасибо всем за добрые подсказки.

 <?php $decoded_input = json_decode(file_get_contents("php://input"), true); //Here you have usual php array stored in $decoded_input. Do some stuff with it. header('Content-type: application/json'); echo json_encode($decoded_input); 

введите описание изображения здесь

Извините, не могу комментировать, Rep до низкого.

Несколько недель назад я также играл с простыми вызовами API, и я сделал небольшую функцию для их обработки.

 public function callAPI($method, $url, $data = false) { $ch = curl_init (); switch ($method) { case "POST" : curl_setopt ( $ch, CURLOPT_POST, 1 ); if ($data) { curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data ); curl_setopt ( $ch, CURLOPT_HTTPHEADER, array ( 'Content-Type: application/json', 'Content-Length: ' . strlen ( $data ) )); } break; case "PUT" : curl_setopt ( $ch, CURLOPT_PUT, 1 ); break; case "GET" : //No settings required break; } curl_setopt ( $ch, CURLOPT_URL, $url ); curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 ); $responde = curl_exec ( $ch ); curl_close ( $ch ); return $responde; } 

Кажется, есть еще одна настройка, требуемая для PUT

curl_setopt ( $ch, CURLOPT_PUT, 1 );

AFAIK ваш вариант curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); только изменяет строку, которая отправляется, а не фактический метод

Soruce: https://curl.haxx.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html