Чи доступні методи PUT, DELETE, HEAD тощо у більшості веб-браузерів?


608

Тут я бачив декілька питань, таких як Як налагодити RESTful служби , в яких згадується:

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

Також я чув, що браузери підтримують лише GET та POST з деяких інших джерел, таких як:

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


1
Про це потрібно не тільки турбуватися про клієнта, багато серверних рамок підтримують лише GET та POST.
дербі

7
Джон, з якої причини ви не хочете тег REST?
Джон Сондерс

11
Хоча люди, які читають це, швидше за все, розслідують API RESTful.
djjeck


Ні, весь браузер не підтримує методи PUT / DELETE, а також не всі технології на стороні сервера не підтримують PUT / DELETE. Лише браузер, підтримуваний HTML 5, підтримує функцію PUT / DELETE.
Яні Деванг

Відповіді:


463

Ні. Специфікація HTML 5 згадує:

Атрибути вмісту методу та формметоду перераховуються атрибутами з такими ключовими словами та станами:

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

Ключове повідомлення , відображення в стані POST, яке вказує метод HTTP POST. Метод POST вимагає, щоб сервер прийняв дані поданої форми для обробки, що може призвести до додавання елемента до бази даних, створення нового ресурсу веб-сторінки, оновлення існуючої сторінки або всіх згаданих результатів .

Діалог ключових слів , відображення у діалозі стану, що вказує на те, що подання форми призначене для закриття діалогового вікна, в якому форма опиняється, якщо така є, і іншим чином не надсилається.

Недійсним значенням за замовчуванням для цих атрибутів є стан GET

Тобто форми HTML підтримують лише GET і POST як методи запиту HTTP. Вирішенням цього є тунелювання інших методів через POST, використовуючи приховане поле форми, яке зчитується сервером і відповідним чином надсилається запит.

Тим НЕ менше, GET , POST , PUT і DELETE будуть підтримані реалізацій XMLHttpRequest (тобто AJAX виклики) у всіх основних веб - браузерів (IE, Firefox, Safari, Chrome, Opera).


170
Ні, я безумовно маю на увазі HTML (я говорю про можливості форм HTML, хоча це може бути не зрозуміло з тексту - я його відредагую)
Меттью Мердок

6
@Matthew: чи означає це, що якщо я використовую IE6 або IE7, маючи таке: - <form .. method = "PUT"> ... </form> він не працюватиме, оскільки PUT недійсний для HTML 4?
Pure.Krome

6
@ Pure.Krome (лише через 14 місяців) Ні, ви не можете зробити <form method = "put"> або <form method = "delete"> під специфікацією HTML 4.01. IE8, Chrome3 або FF3.5 підтримують лише GET та POST.
Джарретт Мейєр

23
@porneL @Alan HTML5 додав їх, а потім видалив. На даний момент дозволено лише GET та POST. goo.gl/8EuZk
Адам Лассек

13
@porneL HTML5 додав їх, а потім видалив їх, і тепер помилка знову відкривається. Цікаво, що я бачив деяку документацію, яка все ще має їх там. Ось помилка, якщо ви хочете слідувати вдома: w3.org/Bugs/Public/show_bug.cgi?id=10671
Еміль Лерч

79

Форми HTML підтримують GET та POST. (HTML5 в один момент додав PUT / DELETE, але вони були скинуті.)

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

Браузери повільно сходяться за правилами, визначеними XMLHttpRequest, але, як зазначає інший коментар, все ж є деякі відмінності.


5
Здається, останній проект HTML5 не підтримує PUT і DELETE: dev.w3.org/html5/spec/Overview.html#attr-fs-method
Стефан Тілков

3
Запропоновано проект повернення їх: amundsen.com/examples/put-delete-forms
Joost Baaij

26
ЦИКАЙ? Птах? Я гадаю, ви маєте на увазі ЧЕКІН. Це смішний обмін голосними.
JayC

52
Ні, я мав на увазі ЧИКЕН, ілюструючи це, можна будь-що, що вам подобається. Домовились про те, що заміни голосних є смішними :-)
Енн

6
Для тих, хто так само збентежений, як і я з цим шикарним
n0nag0n

43

XMLHttpRequest є стандартним об'єктом в моделі Object 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", "POVE", "PROPFIND", "PROPPATCH", "MKCOL" , "COPY", "LOCK", "UNLOCK" та "OPTIONS" .


7
Я сподівався побачити частину документації для подальшого читання, але не кажу, що не вірю вам. Посилання на wikipedia фактично дуже приємні. Спасибі
naugtur

19

_method приховане поле обходу

Використовується в Rails і може бути адаптоване до будь-яких рамок:

  • додайте прихований _methodпараметр до будь-якої форми, яка не GET або POST:

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

    Це можна зробити автоматично в рамках за допомогою допоміжного методу створення HTML (наприклад, Rails form_tag)

  • виправити фактичний метод форми до POST ( <form method="post")

  • обробляє _methodна сервері і робить так, як якщо б цей метод був надісланий замість фактичного POST

Обґрунтування / історія того, чому це неможливо: /software/114156/why-there-are-no-put-and-delete-methods-in-html-forms


Сантілі, привіт, чувак, давно, коли ти запропонував це рішення, давно, і оскільки я новачок у веб-розробці, у мене є питання, на яке я сподіваюся, що ти відповідеш. Отже, ви сказали, що "обробляє _method на сервері і робить точно так, як ніби цей метод був надісланий замість фактичного POST", ви мали на увазі, що якщо прихований метод з PUT (або DELETE) буде поставлений у подання, це фактично означатиме PUT (або ВІДКРИТИ) запит правильно? якщо так, то навіщо використовувати метод POST на початку, а потім використовувати приховані PUT або DELETE. Який зв’язок між POST та PUT (або DELETE) :)
Мирич,

1
@ Міріч форма підтримує лише POST. Тож ми надсилаємо POST із додатковими даними, які сервер знає, що означає: ах, я повинен ставитися до цього як до PUT.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Дякую Кіро за увагу та відповідь, тому чи можу я вважати цей сценарій таким: POST - це універсальна річ, яка містить фактичну POST, PUT, PATCH та DELETE всередині себе, і якщо ви використовуєте POST на початку без прихованого, це означатиме фактичне POST. Але якщо ви використовуєте POST із прихованою (PUT або DELETE), то ви повідомляєте серверу, що ви хочете використовувати PUT або DELETE, які знаходяться всередині POST, як його діти всередині, я знаю трохи дивну аналогію, але чи правильно це? :)
Мирич

1
@Mirich так, я думаю, ти здобув ідею.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Вибачте, Ciro, останнє, мені цікаво, чому PUT і DELETE були видалені з HTML5, оскільки хіба не краще, якщо ви могли просто використовувати PUT або DELETE на початку тегу форми, а не використовувати приховані. Будь ласка, можете пояснити коротко та чітко, що було фактичною причиною для видалення PUT і DELETE. Дякую заздалегідь :)
Мирич

15

Я вважаю, що ці коментарі стосуються конкретно браузерів, тобто натискання посилань та надсилання форм, а не XMLHttpRequest. XMLHttpRequestце лише користувацький клієнт, який ви написали в JavaScript, який використовує браузер як час виконання.

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


XMLHttpRequest - це стандартний об'єкт у моделі Об'єкт JavaScript.
Джейкоб Кралл

9
@Jacob Щоправда, але різні браузери мають різні механізми JavaScript. Знаючи, хто з них підтримує PUT, все ще корисно.
сенфо

1
it's actually JavaScript that is supporting them. Не дуже правда. XMLHttpRequestє "хост-об'єктом", що означає, що це об'єкт, який відкриває функціональність від хоста до коду Javascript. Це не частина самого JS.
Штійн де Віт

9

ТАК , PUT, DELETE, HEAD тощо HTTP-методи доступні у всіх сучасних браузерах.

Щоб відповідати XMLHttpRequest рівня 2, браузери повинні підтримувати ці методи. Щоб перевірити, які браузери підтримують XMLHttpRequest рівень 2, я рекомендую CanIUse:

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

Тільки в Opera Mini бракує підтримки ATM (липень '15), але Opera Mini не має підтримки для всього. :)


7

Додамо лише: Safari 2 і новіші версії напевно не підтримували PUT і DELETE. У мене складається враження 3, але я більше не маю тестувати. Safari 4 безумовно підтримує PUT і DELETE.


5
Чи може хто-небудь підтвердити, яка версія Safari отримала підтримку PUT і DELETE?
міс

1
Хтось може детальніше розглянути питання про те, чи всі веб-переглядачі ЗАРАЗ підтримують PUT & DELETE - і приблизно, як довго це доступно. Зазначаючи на прикладі "CHICKEN", чи означає це, що його повністю залежить від сервера для інтерпретації того, який метод використовується І що JavaScript не обмежує тип методу ...?
Коді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.