Есть ли причина не использовать HTTP PUT и DELETE в веб-приложении?
-
12-09-2019 - |
Вопрос
Оглядываясь вокруг, я не могу назвать ни одного веб-приложения (не веб-сервиса), которое использовало бы что-либо, кроме запросов GET и POST.Есть ли для этого конкретная причина?Некоторые браузеры (или серверы) не поддерживают другие типы запросов?Или это только по историческим причинам?Я хотел бы использовать запросы PUT и DELETE, чтобы немного облегчить себе жизнь на стороне сервера, но я не хочу этого делать, потому что никто больше этого не делает.
Решение
На самом деле довольно много людей используют PUT и DELETE, в основном для небраузерных API.Некоторые примеры: протокол публикации Atom и API данных Google:
Кроме того, вы не увидите широко используемой команды PUT/DELETE, поскольку большинство браузеров не поддерживают PUT и DELETE через формы.HTML5, кажется, исправляет это:
Для браузерных приложений это работает следующим образом:люди разрабатывают RESTful-приложения с учетом PUT и DELETE, а затем «туннелируют» эти запросы через POST из браузера.Например, см. этот вопрос SO о том, как Ruby on Rails выполняет это, используя скрытые поля:
Таким образом, вам не придется самостоятельно разрабатывать свое приложение с учетом более широкого набора HTTP-глаголов.
РЕДАКТИРОВАТЬ:Кстати, если вам интересно, почему PUT/DELETE отсутствуют в сообщениях форм в браузере, то оказывается, что для этого нет серьезной технической причины.Чтение этой ветки в списке рассылки rest-discuss, особенно комментариев Роя Филдинга, интересно в некотором контексте:
РЕДАКТИРОВАТЬ:Есть некоторые комментарии о том, поддерживают ли библиотеки AJAX все методы.Все сводится к фактической реализации XMLHttpRequest в браузере.Я подумал, что кому-то может пригодиться эта ссылка, которая проверяет ваш браузер на предмет совместимости объекта HttpRequest с различными параметрами HTTP.
К сожалению, я не знаю ссылки, в которой собраны эти результаты.
Другие советы
Проще говоря, HTML 4.01 form
элемент допускает только значения "POST
" и "GET
"в своем method
атрибут
Некоторые прокси-сервера с жесткой политикой безопасности могут понизить их. Я использую PUT и DELETE в любом случае.
Я читал, что некоторые браузеры не поддерживают должным образом другие методы HTTP, но не могу назвать никаких подробностей.
Rails, в частности, упакует ваши формы параметром метода, чтобы явно установить его, даже если браузер не поддерживает эти методы.Это кажется разумной мерой предосторожности, если вы собираетесь это сделать.
Я говорю: используйте все возможности HTTP, будь прокляты браузеры, лол.Возможно, это вдохновит на более полное и правильное использование протокола HTTP в будущем.В сети происходит нечто большее, чем просто POST и GET.Вовремя реализации браузеров отразили это.
Это зависит от вашего браузера и библиотеки Ajax.Например jQuery поддерживает все методы HTTP, хотя браузер может этого не делать.См., например, Документация jQuery "ajax" по атрибуту «тип».
А Рестлет Платформа Java позволяет туннелировать запросы PUT и DELETE посредством операций HTML POST.Для этого вы просто добавляете метод=put или метод=delete в строку запроса вашего URI, например:
http://www.example.com/user=xyz?method=delete ...
Это то же самое, что и подход Ruby on Rails (описанный @ars выше).
Лично я действительно не вижу смысла использовать PUT или DELETE в веб-приложении.Все операции, которые выполняет приложение, — это чтение или запись, то есть ввод-вывод.Зачем нужно различать характер операции в заголовке HTTP-запроса?Я мог бы сделать вызовы AJAX с одним и тем же URL -адресом Form /Object /Object_ID и выполнять несколько операций, таких как удаление, обновление, получение значения или создание.Просто взглянув на URL-адрес, я понятия не имею, какой именно.Используя только GET и POST, мои URL-адреса будут:
/объект/идентификатор/удалить
/объект/идентификатор/создать
/объект/идентификатор/обновление
/object/id --> подразумеваемый GET
и т. д.
Исходя из моего ограниченного опыта, во многих случаях это намного чище, чем типы запросов со скрытым заголовком.Я не говорю, что никогда не следует использовать PUT или DELETE, я просто говорю, что используйте их только в случае крайней необходимости.
Обратитесь к статье «Веб-API RESTful» Леонарда Ричардсона, чтобы узнать больше о различных вариантах использования и соглашениях, касающихся методов HTTP-запросов в веб-API RESTful.