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

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

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

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

Тем не менее, несколько быстрых тестов в 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:

http://caniuse.com/

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

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

Другие вопросы по тегам