Есть ли причина не использовать HTTP PUT и DELETE в веб-приложении?

StackOverflow https://stackoverflow.com/questions/1101888

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top