Я делаю (и тестирую) свой небольшой PHP API. Оба метода GET / POST отлично работают при передаче JSON
виде данных.
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 );
[]
Похоже, что получение / разбор на стороне сервера – проблема .
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