Доступны ли методы PUT, DELETE, HEAD и т. Д. В большинстве веб-браузеров? - PullRequest
588 голосов
/ 03 октября 2008

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

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

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

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

Ответы [ 7 ]

454 голосов
/ 03 октября 2008

Нет. В спецификации HTML 5 упоминается:

Атрибуты метода и formmethod являются перечисляемыми атрибутами со следующими ключевыми словами и состояниями:

Ключевое слово get , сопоставленное с состоянием GET, указывающее HTTP GET метод. Метод GET должен только запрашивать и извлекать данные и не должно иметь никакого другого эффекта.

Ключевое слово post , сопоставление с состоянием POST, указывающий метод HTTP POST. Метод POST запрашивает сервер принимает данные отправленной формы для обработки, которые могут результат добавления элемента в базу данных, создание нового веба ресурс страницы, обновление существующей страницы или все упомянутые результаты.

Ключевое слово диалоговое окно , сопоставление с диалоговым окном состояния, указывающее, что отправка формы предназначена для закрытия диалогового окна, в котором Форма находит себя, если таковая имеется, и в противном случае не подает.

Недопустимым значением по умолчанию для этих атрибутов является состояние GET

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

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

76 голосов
/ 05 октября 2008

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

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

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

41 голосов
/ 03 октября 2008

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

15 голосов

_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

15 голосов
/ 03 октября 2008

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

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

8 голосов
/ 21 июля 2015

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

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

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

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

7 голосов
/ 31 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...