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

528

Я видел пару вопросов здесь, например Как отлаживать службы RESTful, в которых говорится:

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

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

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

  • 1
    Вам нужно беспокоиться не только о клиенте, многие серверные инфраструктуры поддерживают только GET и POST.
  • 7
    Джон, по какой причине ты не хочешь тег REST?
Показать ещё 2 комментария
Теги:
browser
http
cross-browser

7 ответов

414
Лучший ответ

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

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

  • 3
    «HTML (до версии 4 и XHTML 1)» <- я полагаю, вы хотели сказать HTTP. Помните: HTML - это формат файла (например, .exe, .doc или .psd), а HTTP - это протокол обмена информацией (например, веб-страницы HTML, изображения или файлы Word .doc).
  • 169
    Нет, я определенно имею в виду HTML (я говорю о возможностях HTML-форм, хотя это может быть не совсем понятно из текста - я его отредактирую)
Показать ещё 16 комментариев
74

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
Показать ещё 8 комментариев
40

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

Согласно Википедии, XMLHttpRequest впервые появился в Internet Explorer 5 как объект ActiveX, но с тех пор был превращен в стандарт и имеет был включен для использования в JavaScript в семействе Mozilla с 1.0, Apple Safari 1.2, Opera 8.0 и 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 ".

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

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

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

  • 0
    XMLHttpRequest - это стандартный объект в объектной модели JavaScript.
  • 9
    @Jacob Правда, но разные браузеры имеют разные движки JavaScript. Знание того, кто поддерживает PUT, все еще полезно.
Показать ещё 1 комментарий
11

Обходное решение скрытого поля

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

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

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

    Это можно сделать автоматически в рамках с помощью метода создания HTML-метода (например, Rails form_tag)

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

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

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

  • 0
    Сантилли, привет, чувак, прошло много времени с тех пор, как ты предлагал это решение, и, поскольку я новичок в веб-разработке, у меня есть вопрос, на который, я надеюсь, ты ответишь. Итак, вы сказали, что «обрабатывает _method на сервере и делает точно так, как если бы этот метод был отправлен вместо фактического POST», вы имели в виду, что если скрытый метод с PUT (или DELETE) будет помещен в представление, это фактически будет означать PUT (или УДАЛИТЬ) запрос правильно? если да, то зачем использовать метод POST в начале, а затем использовать скрытый PUT или DELETE. Какая связь между POST и PUT (или DELETE) :)
  • 1
    @Mirich форма поддерживает только POST. Таким образом, мы отправляем POST с дополнительными данными, которые сервер знает, значит: ах, я должен рассматривать это как PUT.
Показать ещё 4 комментария
8

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

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню