Какая альтернатива рекомендуется, когда клиент не может сделать запрос PUT / DELETE? - PullRequest
1 голос
/ 14 февраля 2011

Я ищу реализацию RESTful API, и мне было интересно, какой параметр рекомендуется, когда клиент браузера не может сделать запрос PUT / DELETE на сервер.(поскольку какой-то браузер явно не поддерживает эти запросы )

Существует ли для него конкретное имя параметра?(что-то вроде request_method = DELETE в запросе POST, это должно указывать серверу, что клиент действительно хочет DELETE, но не может указать это)?или таких спецификаций нет?

Мой поиск приводит меня к параметрам"_method", используемым prototype.js.Но являются ли эти параметры стандартными?Например, как jQuery справляется с этим?

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 15 февраля 2011

То, о чем вы, по сути, спрашиваете, называется перегрузкой метода - хотя это не 100% RESTful, это подход, к которому вы можете прибегнуть в случае, если клиент не поддерживает методы PUT / DELETE.В книге Ричардсона / Руби Веб-службы RESTful также упоминается этот метод.

Вы сами сформулировали основной принцип в своем вопросе - разница по сравнению с полностью подходом RESTful заключается в том, что вы вводите новыйпараметр, который передается как часть тела запроса через POST.Этот параметр указывает предполагаемый метод (например, POST / PUT / DELETE), который отправляется через (перегруженный) запрос POST.Это позволяет вам преодолеть ограничение HTTP-метода клиента, сохраняя при этом ваш URI-дизайн чистым и RESTful (например, без глаголов).Однако вы все равно должны стремиться быть как можно более RESTful, то есть продолжать использовать GET для запросов только для чтения (таким образом, не влияя на кеширование и т. Д.) И использовать перегруженную запись для любых запросов на запись.Что касается того, как назвать параметр, который содержит истинный метод HTTP - я сам не знаю ни одной стандартизированной политики именования, поэтому следует использовать то, что используется в Prototype.js (или с любым именем, которое хорошо вписывается в вашу политику именования)отлично.

Что касается jQuery и XmlHttpRequest в целом, они должны поддерживать методы PUT и DELETE.См .:

Обратите внимание, что документация jQuery предупреждает о поддержке PUT / DELETE, зависящей от браузера.Насколько я понимаю, эти методы должны поддерживаться при использовании XHR ... однако вам следует скорее проверить, поддерживают ли все ваши целевые браузеры эти методы, прежде чем принимать решение между перегрузкой POST и полным стеком HTTP-методов.

jQuery по умолчанию обеспечивает доступ к методам .get() и .post(), которые оба построены поверх .ajax().Для выполнения вызовов PUT / DELETE через jQuery вам нужно напрямую использовать метод .ajax() и указать его в настройках type.Это, однако, делает истинный запрос PUT / DELETE, так как сам jQuery не предоставляет никаких автоматических средств для обработки перегрузки методов (поэтому вам нужно кодировать его самостоятельно, чтобы он вписывался в ваш дизайн API).

Если выЯ не буду использовать XHR и должен полагаться на стандартные формы, поэтому я боюсь, что вам придется использовать перегрузку методов, поскольку поддержка методов PUT / DELETE в качестве допустимых значений действия формы была исключена из спецификации HTML5 (это также было отмечено в вопросе SO, на который вы ссылаетесь).

1 голос
/ 14 февраля 2011

Методы PUT / DELETE / GET обычно определяются заголовками HTTP, отправляемыми с запросом. Несмотря на то, что вы должны придерживаться методов, которые вы можете сделать действительно в своем сервисе, с помощью входящего вызова - тогда вы как бы ломаете идею сервисов RESTfull:)

Вот очень информативный пост на REST, который должен помочь прояснить ваши мысли - Понимание REST: глаголы, коды ошибок и аутентификация

...