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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Используется в 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

Ответ 6

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

Ответ 7

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

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

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

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