Доступны ли методы 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 не поддерживает все.:)