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

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

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

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

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

7 ответов


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

, GET, в должности, PUT и удалить are поддерживается реализациями 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, as указано RFC 2616.

в качестве примечания IE 7-8 разрешает только следующие методы HTTP:" GET"," POST"," HEAD"," PUT"," DELETE"," MOVE"," PROPFIND"," PROPPATCH"," MKCOL"," COPY"," LOCK"," UNLOCK "и"OPTIONS".


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

UPDATE: чтобы уточнить, я не имел в виду (хотя я писал), что вы писал XMLHttpRequest, Я имел в виду, что ты написал код, который использует XMLHttpRequest. Браузеры изначально не поддерживают XMLHttpRequest. XMLHttpRequest происходит из JavaScript среда выполнения, которая может быть размещена браузером, хотя это и не обязательно (см. носорог). Вот почему люди говорят, что браузеры не поддерживают PUT и DELETE-потому что на самом деле их поддерживает JavaScript.


_method скрытое поле решение

использованный в рельсах и смогл быть приспособлено к любым рамкам:

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

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

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

  • исправить фактический метод формы для публикации (<form method="post")

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

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


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


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

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

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

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