Я пишу API и хочу следовать REST-подходу.Насколько я понимаю, если я хочу позволить пользователям API обновлять определенные записи, должен поддерживаться запрос типа PUT <a href="http://server/specific" rel="nofollow">http://server/specific</a>_resource
.Конечно, они не делают GET
, и им нужно будет передать новые данные, и мой вопрос заключается в том, как это сделать (в моем конкретном случае я обновляю только некоторые поля указанной записи, но это не так.так актуально тут).Я могу придумать два подхода: включить данные в тело запроса (используя curl: curl -X PUT -d "key=value" <a href="http://server/specific" rel="nofollow">http://server/specific</a>_resource
) или в строку запроса (используя curl: curl -X PUT <a href="http://server/specific" rel="nofollow">http://server/specific</a>_resource?key=value
).
К сожалению, независимо от подходаЯ беру, кажется, очень трудно получить предоставленные данные.Кажется, проблема в том, что PHP действительно полностью понимает только два HTTP-метода, GET
и POST
, причем PUT
считается для загрузки файлов .Если я включу данные в тело, то единственный способ получить к ним доступ, по-видимому, будет через fopen('php://input')
вызов .Например, http_get_request_body()
не предоставляет данные.Аналогично, информация не может быть найдена в суперглобальном $_REQUEST
.Если я не хочу обрабатывать необработанное тело запроса с помощью fopen('php://input')
, тогда получается, что я должен отправить данные в виде параметров строки запроса, так как данные будут отображаться как элементы суперглобального $_GET
(и так же $_REQUEST
).
Я специально использую CakePHP, и он, похоже, заполняет массив form
массива params
в методе моего контроллера , если запрос был POST .Параметры строки запроса помещаются в массив params
'url
независимо от метода запроса, если он используется в URL-адресе запроса.Не удивительно, что я не единственный , кто столкнулся с этим.
Какое решение вы бы предложили?Обрабатывать входной поток?Использовать параметры строки запроса?Просто забудьте PUT
глагол и используйте POST
вместо этого?