Доступны ли методы PUT, DELETE, HEAD и т. Д. В большинстве веб-браузеров?
Здесь я видел пару вопросов, таких как "Отладка сервисов RESTful", в которых упоминается:
К сожалению, тот же браузер не позволяет мне тестировать HTTP PUT, DELETE и, в некоторой степени, даже HTTP POST.
Я также слышал, что браузеры поддерживают только GET и POST из некоторых других источников, таких как:
- http://www.packetizer.com/ws/rest.html
- http://www.mail-archive.com/jmeter-user@jakarta.apache.org/msg13518.html
- http://www.xml.com/cs/user/view/cs_msg/1098
Тем не менее, несколько быстрых тестов в Firefox показывают, что отправка PUT
а также DELETE
запросы работают как положено - XMLHttpRequest
успешно завершается, и запрос отображается в журналах сервера с правильным методом. Есть ли какой-то аспект, который я пропускаю, например, кросс-браузерная совместимость или неочевидные ограничения?
7 ответов
HTML-формы (до HTML версии 4 и XHTML 1) поддерживают только GET и POST как методы HTTP-запроса. Обходной путь для этого состоит в том, чтобы туннелировать другие методы через POST, используя скрытое поле формы, которое читается сервером, и запрос отправляется соответственно.
Однако GET, POST, PUT и DELETE поддерживаются реализациями XMLHttpRequest (то есть вызовами AJAX) во всех основных веб-браузерах (IE, Firefox, Safari, Chrome, Opera).
HTML-формы поддерживают GET и POST. (HTML5 в какой-то момент добавил PUT/DELETE, но они были удалены.)
XMLHttpRequest поддерживает каждый метод, включая CHICKEN, хотя некоторые имена методов сопоставляются без учета регистра (методы чувствительны к регистру для HTTP), а некоторые имена методов вообще не поддерживаются по соображениям безопасности (например, CONNECT).
Браузеры постепенно сходятся по правилам, указанным в XMLHttpRequest, но, как указано в другом комментарии, все еще есть некоторые различия.
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".
_method
Обход скрытого поля
Используется в 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
Я считаю, что эти комментарии относятся именно к браузерам, т. Е. К ссылкам и отправке форм, а не к XMLHttpRequest
, XMLHttpRequest
это просто пользовательский клиент, написанный на JavaScript, который использует браузер как среду выполнения.
ОБНОВЛЕНИЕ: Чтобы уточнить, я не имел в виду (хотя я написал), что вы написали XMLHttpRequest
; Я имел в виду, что вы написали код, который использует XMLHttpRequest
, Браузеры изначально не поддерживают XMLHttpRequest
, XMLHttpRequest
происходит из среды выполнения JavaScript, которая может быть размещена в браузере, хотя это не обязательно (см. Rhino). Вот почему люди говорят, что браузеры не поддерживают PUT
а также DELETE
Потому что на самом деле их поддерживает JavaScript.
ДА, PUT, DELETE, HEAD и т. Д. HTTP-методы доступны во всех современных браузерах.
Для совместимости с XMLHttpRequest браузеры уровня 2 должны поддерживать эти методы. Чтобы проверить, какие браузеры поддерживают XMLHttpRequest Level 2, я рекомендую CanIUse:
Только в Opera Mini отсутствует поддержка atm (juli '15), но в Opera Mini отсутствует поддержка для всего.:)
Просто добавлю - Safari 2 и более ранние версии определенно не поддерживали PUT и DELETE. У меня сложилось впечатление, что 3 сделал, но у меня больше нет возможности его проверять. Safari 4 определенно поддерживает PUT и DELETE.