Доступны ли методы PUT, DELETE, HEAD и т. Д. В большинстве веб-браузеров?

608

Здесь я видел пару вопросов, таких как «Отладка сервисов RESTful» , в которых упоминается:

К сожалению, тот же браузер не позволяет мне проверять HTTP PUT, DELETE и, в некоторой степени, даже HTTP POST.

Я также слышал, что браузеры поддерживают только GET и POST из некоторых других источников, таких как:

Тем не менее, несколько быстрых тестов в Firefox показывают, что отправка PUTи DELETEзапросы работают должным образом - они XMLHttpRequestуспешно завершаются, и запрос отображается в журналах сервера с правильным методом. Есть ли какой-то аспект, который я пропускаю, например, совместимость с разными браузерами или неочевидные ограничения?

Джон Милликин
источник
1
Вам нужно беспокоиться не только о клиенте, многие серверные инфраструктуры поддерживают только GET и POST.
Дерби
7
Джон, по какой причине ты не хочешь тэг REST?
Джон Сондерс
11
Хотя люди, которые читают это, вероятно, будут исследовать RESTful API.
Джек
Нет, все браузеры не поддерживают методы PUT / DELETE, а также не все технологии на стороне сервера не поддерживают PUT / DELETE. Только HTML 5 поддерживает браузер поддерживает PUT / DELETE.
Яни Деванг

Ответы:

463

Нет. Спецификация HTML 5 упоминает:

Атрибуты метода и formmethod являются перечисляемыми атрибутами со следующими ключевыми словами и состояниями:

Ключевое слово get , отображающее состояние GET, указывающее метод HTTP GET. Метод GET должен только запрашивать и извлекать данные и не должен иметь никакого другого эффекта.

Ключевое слово post , отображающее состояние POST с указанием метода HTTP POST. Метод POST запрашивает, чтобы сервер принял данные отправленной формы для обработки, что может привести к добавлению элемента в базу данных, созданию ресурса новой веб-страницы, обновлению существующей страницы или всем упомянутым результатам. ,

Диалоговое окно с ключевым словом , отображающее диалоговое окно состояния, указывающее, что отправка формы предназначена для закрытия диалогового окна, в котором находится форма, если таковая имеется, и в противном случае не для отправки.

Недопустимым значением по умолчанию для этих атрибутов является состояние GET.

Т.е. формы HTML поддерживают только GET и POST как методы HTTP-запроса. Обходным путем для этого является туннелирование других методов через POST, используя скрытое поле формы, которое читается сервером, и запрос отправляется соответственно.

Тем не менее, GET , POST , PUT и DELETE будут поддержаны реализаций XMLHttpRequest (т.е. AJAX вызовы) во всех основных веб - браузеров (IE, Firefox, Safari, Chrome, Opera).

Мэтью Мердок
источник
170
Нет, я определенно имею в виду HTML (я говорю о возможностях HTML-форм, хотя это может быть не совсем понятно из текста - я его отредактирую)
Мэтью Мердок
6
@ Matthew: означает ли это, что если я использую IE6 или IE7 со следующим: - <form .. method = "PUT"> ... </ form> он не будет работать, потому что PUT недопустим для HTML 4?
Pure.Krome
6
@ Pure.Krome (только 14 месяцев спустя) Нет, вы не можете выполнять <form method = "put"> или <form method = "delete"> в спецификации HTML 4.01. Только GET и POST поддерживаются IE8, Chrome3 или FF3.5.
Джаррет Мейер
23
@porneL @Alan HTML5 добавил их, а затем удалил их. В настоящее время разрешены только GET и POST. goo.gl/8EuZk
Адам Лассек
13
@porneL HTML5 добавил их, а затем удалил их, и теперь ошибка вновь открывается. Интересно, что я видел некоторые документы, в которых они все еще есть. Вот ошибка, если вы хотите следовать дома: w3.org/Bugs/Public/show_bug.cgi?id=10671
Эмиль Лерч,
79

HTML-формы поддерживают GET и POST. (HTML5 в какой-то момент добавил PUT / DELETE, но они были удалены.)

XMLHttpRequest поддерживает каждый метод, включая CHICKEN, хотя некоторые имена методов сопоставляются без учета регистра (методы чувствительны к регистру для HTTP), а некоторые имена методов вообще не поддерживаются по соображениям безопасности (например, CONNECT).

Браузеры постепенно сходятся по правилам, указанным в XMLHttpRequest, но, как указано в другом комментарии, все еще есть некоторые различия.

Энн
источник
5
В последнем проекте HTML5, похоже, отсутствует поддержка PUT и DELETE: dev.w3.org/html5/spec/Overview.html#attr-fs-method
Стефан Тилков,
3
Был предложен черновик, чтобы получить их обратно: amundsen.com/examples/put-delete-forms
Joost Baaij
26
КУРИЦА? Птица? Я полагаю, вы имеете в виду CHECKIN. Это забавный обмен гласными.
JayC
52
Нет, я имел в виду ЦЫПЛЕНОК, иллюстрируя это может быть как угодно. Договорились о смешном обмене гласными :-)
Anne
6
Для таких же изумленных, как и я, с этим бизнесом CHICKEN
n0nag0n
43

XMLHttpRequest является стандартным объектом в объектной модели JavaScript.

Согласно Википедии, он XMLHttpRequestвпервые появился в Internet Explorer 5 как объект ActiveX, но с тех пор превратился в стандарт и был включен для использования в JavaScript в семействе Mozilla с 1.0, Apple Safari 1.2, Opera 7.60-p1 и IE 7.0 ,

open()Метод на объекте принимает метод HTTP в качестве аргумента - и определяется как принимать любой допустимый метод HTTP (см пункт номер 5 канала связи) - в том числе GET, POST, HEAD, PUTи DELETE, как и определено в RFC 2616 .

В качестве дополнительного примечания IE 7–8 разрешают только следующие методы HTTP: «GET», «POST», «HEAD», «PUT», «DELETE», «MOVE», «PROPFIND», «PROPPATCH», «MKCOL» , «COPY», «LOCK», «UNLOCK» и «OPTIONS» .

Vihung
источник
7
Я надеялся увидеть некоторые документы для дальнейшего прочтения, не могу сказать, что не верю вам. Ссылки в Википедии довольно хороши на самом деле. Спасибо
naugtur
19

_method Обход скрытого поля

Используется в Rails и может быть адаптирован к любой среде:

  • добавьте скрытый _methodпараметр в любую форму, которая не является GET или POST:

    <input type="hidden" name="_method" value="DELETE">

    Это может быть сделано автоматически в рамках через вспомогательный метод создания HTML (например, Rails form_tag)

  • исправить фактический метод формы в POST ( <form method="post")

  • процессы _methodна сервере и делают точно так, как если бы этот метод был отправлен вместо фактического POST

Обоснование / история того, почему это невозможно: /software/114156/why-there-are-no-put-and-delete-methods-in-html-forms

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
источник
Сантилли, привет, чувак, прошло много времени с тех пор, как ты предлагал это решение, и, поскольку я новичок в веб-разработке, у меня есть вопрос, на который, я надеюсь, ты ответишь. Итак, вы сказали, что «обрабатывает _method на сервере и делает точно так, как если бы этот метод был отправлен вместо фактического POST», вы имели в виду, что если скрытый метод с PUT (или DELETE) будет помещен в представление, это фактически будет означать PUT (или УДАЛИТЬ) запрос правильно? если да, то зачем использовать метод POST в начале, а затем использовать скрытый PUT или DELETE. Какая связь между POST и PUT (или DELETE) :)
Мирич
1
@Mirich форма поддерживает только POST. Таким образом, мы отправляем POST с дополнительными данными, которые сервер знает: значит, я должен рассматривать это как PUT.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
Спасибо, Сиро, за внимание и ответ, так что я могу рассмотреть этот сценарий так: POST - это универсальная вещь, которая содержит фактические POST, PUT, PATCH и DELETE внутри себя, и если вы используете POST в начале без скрытого, то это будет означать фактический ПОСЛЕ. Но если вы используете POST со скрытым (PUT или DELETE), вы даете серверу знать, что вы хотите использовать PUT или DELETE, которые находятся внутри POST как его дочерние элементы внутри. Я знаю немного странную аналогию, но так ли это? :)
Мирич
1
@Mirich Да, я думаю, вы поняли идею.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
извините, Сиро, последнее, мне интересно, почему PUT и DELETE были удалены из HTML5, так как было бы лучше, если бы вы могли просто использовать PUT или DELETE в начале тега формы и просто не использовать скрытый. Пожалуйста, вы можете кратко и ясно объяснить, что было причиной удаления PUT и DELETE. Заранее спасибо :)
Мирич
15

Я полагаю, что эти комментарии относятся конкретно к браузерам, т. Е., Щелкая ссылки и отправляя формы, а не XMLHttpRequest. XMLHttpRequestэто просто пользовательский клиент , который вы писали в JavaScript , который использует браузер в качестве выполнения.

ОБНОВЛЕНИЕ: Чтобы уточнить, я не имел в виду (хотя я действительно писал), что вы написали XMLHttpRequest; Я имел в виду, что вы написали код, который использует XMLHttpRequest. Браузеры изначально не поддерживают XMLHttpRequest. XMLHttpRequestпроисходит из среды выполнения JavaScript, которая может быть размещена в браузере, хотя это не обязательно (см. Rhino ). Вот почему люди говорят, что браузеры не поддерживают PUTи, DELETEпотому что на самом деле их поддерживает JavaScript.

Хэнк Гей
источник
XMLHttpRequest - это стандартный объект в объектной модели JavaScript.
Джейкоб Кралл
9
@Jacob Правда, но разные браузеры имеют разные движки JavaScript. Знать, какие из них поддерживают PUT, все еще полезно.
Senfo
1
it's actually JavaScript that is supporting them, Не совсем правда. XMLHttpRequestявляется «хост-объектом», что означает, что это объект, который предоставляет функциональность от хоста к коду Javascript. Это не часть самого JS.
Стейн де Витт
9

ДА , PUT, DELETE, HEAD и т. Д. HTTP-методы доступны во всех современных браузерах.

Чтобы быть совместимыми с XMLHttpRequest, браузеры уровня 2 должны поддерживать эти методы. Чтобы проверить, какие браузеры поддерживают XMLHttpRequest Level 2, я рекомендую CanIUse:

http://caniuse.com/#feat=xhr2

Только в Opera Mini отсутствует поддержка atm (juli '15), но в Opera Mini отсутствует поддержка для всего. :)

Стейн де Витт
источник
7

Просто добавлю - Safari 2 и более ранние версии определенно не поддерживали PUT и DELETE. У меня сложилось впечатление, что 3 сделал, но я больше не могу его проверять. Safari 4 определенно поддерживает PUT и DELETE.

jharlap
источник
5
Кто-нибудь может подтвердить, какая версия Safari получила поддержку PUT и DELETE?
MJS
1
Может кто-нибудь уточнить, все ли браузеры СЕЙЧАС поддерживают PUT & DELETE - и сколько примерно это было доступно. Отмечая на примере "CHICKEN", означает ли это, что все зависит от сервера, чтобы интерпретировать, какой метод используется И что JavaScript не ограничивает тип метода ...?
Коди