Я использую slim php framework для разработки REST API. Я успешно выполняю запросы POST и GET. Я использую промежуточное ПО ContentTypes, а также для разбора тела JSON в сообщениях POST и PUT, однако мой запрос PUT всегда дает пустую строку на сервере. POST просто отлично работает, и я могу получить анализируемый JSON как ассоциативный массив PHP, но не могу получить его в запросе PUT. Я использую application/json в заголовках, и я не хочу использовать метод application/x-www-form-urlencoded.
$app->map('/example/:id', function ($id) use($app, $log) {
//$body = $app->request()->getBody();
//using the above in other POST calls & it works but does not in this case
$body = json_decode($app->request()->getBody()); //tried this. no success
var_dump($body);
} )->via ( 'PUT', 'PATCH' );
Я называю это через CURL, как это
$headers = array(
'Content-Type'=>'application/json;charset=utf-8',
);
$id = 123;
$body = array("name"=>"myfirstname","email"=>"myemail");
$json_str = json_encode($body);
$response = Requests::put($base_url.'/api/v1/example/'.$id,$headers,$json_str);
Когда я пытаюсь вернуть тот же JSON из API, он возвращает пустой массив. Я попробовал POSTMAN на хром и выше кода, но не работает. В чем проблема.
Обновление: я проверил, что тот же код работает на localhost, но не работает на удаленном сервере. В чем причина? Нужно ли изменять любые настройки на сервере?
Попробуйте использовать getInstance().
$body = json_decode($app->getInstance()->request()->getBody());
Slim читает php://input
для получения содержимого тела запроса, поэтому, какова бы ни была проблема, он связан с данными этого потока.
У вас есть другой код, который пытается прочитать php://input
? Если это так, обратите внимание, что это возможно только с PHP 5.6 (что может быть у вашей локальной машины, когда ваш сервер не работает).
php://input
но я не читаю это прямо в моем коде. Путаница в том, что POST работает, и я уверен, что slim читаетphp://input
для post. Мой сервер на php 5.3.13, и мне кажется, что это проблема, но опять же, почему тогда работает метод post?