PHP получить PUT тело запроса - PullRequest
12 голосов
/ 13 марта 2012

В настоящее время я разрабатываю Restful Json-API на PHP. Я хочу отправить запрос PUT на items/:id, чтобы обновить запись. Данные будут переданы как application/json.

Я хочу вызвать API с помощью

curl -H "Content-Type: application/json" -X PUT -d '{"example" : "data"}' "http://localhost/items/someid"

На стороне сервера я не могу получить тело запроса. Я пытался

file_get_contents("php://input");

но это возвращает пустую строку. Также комбинация fopen() / fread() не работает.

При звонке через POST все отлично работает, я отлично читаю json на стороне сервера. Но API больше не является Restful. У кого-нибудь есть решение для этого? Есть ли другой способ отправить и получить Json?

Кстати, я разрабатываю API с помощью Slim Framework .

Ответы [ 4 ]

13 голосов
/ 13 марта 2012

php://input доступен для чтения только один раз для запросов PUT:

Примечание: поток, открытый с помощью php: // input, может быть прочитан только один раз; поток не поддерживает операции поиска. Однако, в зависимости от реализации SAPI, может быть возможно открыть другой поток ввода php: // и возобновить чтение. Это возможно только в том случае, если данные тела запроса были сохранены. Как правило, это касается запросов POST, но не других методов запросов, таких как PUT или PROPFIND.

http://php.net/manual/en/wrappers.php.php

Платформа Slim уже считывает данные по запросу. Возьмите данные из объекта Request, в который они были прочитаны.

2 голосов
/ 13 марта 2012

На стороне сервера я не могу получить тело запроса. Я пытался file_get_contents ("php: // input");

Вы можете использовать file_get_contents( 'php://input', 'r' ); только один раз для запроса. Получение его значений также усекает значения, поэтому, если вы вызовете его дважды, он вернет пустую строку. Объект запроса Slim содержит нужные вам значения, поэтому:

<?php
$app = new Slim( );

$app->put( '/items/someid', function () use ( $app ) {
    echo $app->request( )->put( 'example' ); // should display "data".
});
0 голосов
/ 13 марта 2012

Пример из руководства по PHP использует fopen для доступа к вводу php: // в режиме чтения.Вы пытались сделать это таким образом вместо этого?

РЕДАКТИРОВАТЬ: справочная страница для PHP: // говорит, что некоторые вещи, которые, кажется, предполагают, что данные PUT могут быть недоступны в некоторых случаях!

Примечание. Поток, открытый с помощью ввода php: //, может быть прочитан только один раз;поток не поддерживает операции поиска.Однако, в зависимости от реализации SAPI, может быть возможно открыть другой поток ввода php: // и возобновить чтение.Это возможно только в том случае, если данные тела запроса были сохранены.Как правило, это относится к запросам POST, но не к другим методам запросов, таким как PUT или PROPFIND.

Я не знаю, где это вас покинет в отношении обработки PUT.Кажется, одна страница говорит, что это возможно, а другая, кажется, подразумевает, что она не будет работать при неправильном стечении обстоятельств

0 голосов
/ 13 марта 2012

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

Выдержка:

К сожалению, современные браузеры не предоставляют встроенную поддержку запросов PUT.Чтобы обойти это ограничение, убедитесь, что метод вашей HTML-формы «post», затем добавьте параметр переопределения метода в свою HTML-форму следующим образом:

<form action="/books/1" method="post">
    ... other form fields here...
    <input type="hidden" name="_METHOD" value="PUT"/>
    <input type="submit" value="Update Book"/>
</form>

Источник: http://www.slimframework.com/documentation/stable

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...