Czy metody PUT, DELETE, HEAD itp. Są dostępne w większości przeglądarek internetowych?

608

Widziałem tutaj kilka pytań, takich jak debugowanie usług RESTful , które wspominają:

Niestety ta sama przeglądarka nie pozwala mi testować HTTP PUT, DELETE, a do pewnego stopnia nawet HTTP POST.

Słyszałem również, że przeglądarki obsługują tylko GET i POST z innych źródeł, takich jak:

Jednak kilka szybkich testów w Firefoksie pokazuje, że wysyłanie PUTi DELETEżądania działają zgodnie z oczekiwaniami - XMLHttpRequestzakończy się pomyślnie, a żądanie pojawia się w logach serwera przy użyciu właściwej metody. Czy brakuje mi jakiegoś aspektu, takiego jak zgodność między przeglądarkami lub nieoczywiste ograniczenia?

John Millikin
źródło
1
To nie tylko klient, o który musisz się martwić, wiele ram po stronie serwera obsługuje tylko GET i POST.
derby
7
John, z jakiegoś powodu nie chcesz tagu REST?
John Saunders,
11
Chociaż osoby, które to czytają, prawdopodobnie badają interfejsy API RESTful.
djjeck
Nie, wszystkie przeglądarki nie obsługują metod PUT / DELETE, a także nie wszystkie technologie po stronie serwera nie obsługują PUT / DELETE. Tylko przeglądarka obsługująca HTML 5 obsługuje PUT / DELETE.
Jani Devang

Odpowiedzi:

463

Nie. Specyfikacja HTML 5 wspomina:

Atrybuty treści metody i metody są wyliczone z następującymi słowami kluczowymi i stanami:

Słowo kluczowe get , odwzorowujące na stan GET, wskazujące metodę HTTP GET. Metoda GET powinna tylko żądać i pobierać dane i nie powinna mieć żadnego innego efektu.

Słowo kluczowe post , odwzorowane na stan POST, wskazujące metodę HTTP POST. Metoda POST żąda od serwera zaakceptowania danych przesłanego formularza do przetworzenia, co może spowodować dodanie elementu do bazy danych, utworzenie nowego zasobu strony internetowej, aktualizację istniejącej strony lub wszystkich wymienionych wyników .

Okno dialogowe słowa kluczowego , odwzorowane na okno stanu, wskazujące, że przesłanie formularza ma na celu zamknięcie okna dialogowego, w którym znajduje się formularz, jeśli istnieje, i w inny sposób nie może zostać przesłany.

Niepoprawną wartością domyślną dla tych atrybutów jest stan GET

Czyli formularze HTML obsługują tylko GET i POST jako metody żądania HTTP. Obejściem tego problemu jest tunelowanie innych metod za pomocą testu POST przy użyciu ukrytego pola formularza, które jest odczytywane przez serwer i odpowiednio wysyłane żądanie.

Jednak GET , POST , PUT i DELETE obsługiwane przez implementacje XMLHttpRequest (tj. Wywołania AJAX) we wszystkich głównych przeglądarkach internetowych (IE, Firefox, Safari, Chrome, Opera).

Matthew Murdoch
źródło
170
Nie, zdecydowanie mam na myśli HTML (mówię o możliwościach formularzy HTML, chociaż z tekstu może to nie wynikać jasno - będę go edytować)
Matthew Murdoch,
6
@Matthew: czy to oznacza, że ​​jeśli używam IE6 lub IE7, z następującymi: - <form .. method = "PUT"> ... </form> nie będzie działać, ponieważ PUT nie jest poprawny dla HTML 4?
Pure.Krome
6
@ Pure.Krome (dopiero 14 miesięcy później) Nie, nie można wykonać <form method = "put"> lub <form method = "delete"> w specyfikacji HTML 4.01. Tylko GET i POST są obsługiwane przez IE8, Chrome3 lub FF3.5.
Jarrett Meyer
23
@porneL @Alan HTML5 dodał je, a następnie usunął. Obecnie dozwolone są tylko GET i POST. goo.gl/8EuZk
Adam
13
@porneL HTML5 dodał je, a następnie usunął, a teraz błąd został ponownie otwarty. Co ciekawe, widziałem dokumentację, która wciąż je tam zawiera. Oto błąd, jeśli chcesz śledzić w domu: w3.org/Bugs/Public/show_bug.cgi?id=10671
Emil Lerch
79

Formularze HTML obsługują metody GET i POST. (W jednym punkcie HTML5 dodano PUT / DELETE, ale zostały one usunięte).

XMLHttpRequest obsługuje każdą metodę, w tym CHICKEN, chociaż niektóre nazwy metod są dopasowywane do wielkości liter bez rozróżniania wielkości liter (w metodach rozróżniana jest wielkość liter dla HTTP), a niektóre nazwy metod nie są w ogóle obsługiwane ze względów bezpieczeństwa (np. CONNECT).

Przeglądarki powoli dostosowują się do reguł określonych przez XMLHttpRequest, ale jak wskazał inny komentarz, nadal istnieją pewne różnice.

Anne
źródło
5
Wygląda na to, że najnowsza wersja HTML5 porzuciła obsługę PUT i DELETE: dev.w3.org/html5/spec/Overview.html#attr-fs-method
Stefan Tilkov
3
Zaproponowano projekt ich odzyskania: amundsen.com/examples/put-delete-forms
Joost Baaij
26
KURCZAK? Ptak? Podejrzewam, że masz na myśli CHECKIN. To zabawna zamiana samogłosek.
JayC
52
Nie, miałem na myśli KURCZAKA, ilustrując, że może być czymkolwiek zechcesz. Zgodziliśmy się, że zamiana samogłosek jest zabawna :-)
Anne
6
Dla osób równie oszołomionych, jak ja tym biznesem KURCZAKA .... w3c-test.org/XMLHttpRequest/open-method-case-sensitive.htm
n0nag0n
43

XMLHttpRequest jest standardowym obiektem w modelu obiektowym JavaScript.

Według Wikipedii, XMLHttpRequestpo raz pierwszy pojawił się w Internet Explorerze 5 jako obiekt ActiveX, ale od tego czasu stał się standardem i został włączony do JavaScript w rodzinie Mozilla od 1.0, Apple Safari 1.2, Opera 7.60-p1 i IE 7.0 .

open()Metoda na obiekcie odbywa metodę HTTP jako argument - a jest określona jako podjęciem ważnej metody HTTP (patrz numer pkt 5 link) - w tym GET, POST, HEAD, PUTi DELETE, jak określono w dokumencie RFC 2616 .

Uwaga dodatkowa IE 7–8 zezwala tylko na następujące metody HTTP: „GET”, „POST”, „HEAD”, „PUT”, „DELETE”, „MOVE”, „PROPFIND”, „PROPPATCH”, „MKCOL” , „COPY”, „LOCK”, „UNLOCK” i „OPTIONS” .

Vihung
źródło
7
Miałem nadzieję, że zobaczę trochę dokumentacji do dalszego czytania. Nie twierdzę, że ci nie wierzę. Linki na wikipedii są całkiem fajne. Dzięki
naugtur
19

_method obejście ukrytego pola

Używany w Railsach i może być dostosowany do dowolnego frameworka:

  • dodaj ukryty _methodparametr do dowolnej formy, która nie jest GET ani POST:

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

    Można to zrobić automatycznie we frameworku za pomocą metody pomocniczej tworzenia HTML (np. Railsów form_tag)

  • napraw rzeczywistą metodę formularza na POST ( <form method="post")

  • Procesy _methodna serwerze i zrobić dokładnie tak, jakby ta metoda została wysłana zamiast rzeczywistej POST

Uzasadnienie / historia, dlaczego nie jest to możliwe: /software/114156/why-there-are-no-put-and-delete-methods-in-html-forms

Ciro Santilli
źródło
Santilli, cześć, stary, już dawno nie zaproponowałeś tego rozwiązania, a ponieważ jestem początkującym programistą, mam pytanie, na które mam nadzieję odpowiesz. Powiedziałeś więc, że „przetwarza _ metodę na serwerze i postępuj dokładnie tak, jakby ta metoda została wysłana zamiast rzeczywistego testu POST”, co oznaczało, że jeśli ukryta metoda z PUT (lub DELETE) zostanie umieszczona w widoku, to w rzeczywistości oznacza PUT (lub USUŃ) żądanie, prawda? jeśli tak, to po co używać metody POST na początku, a następnie użyć ukrytego PUT lub DELETE. Jaki jest związek między POST a PUT (lub DELETE) :)
Mirich
1
@Mirich formularz obsługuje tylko POST. Wysyłamy więc POST z dodatkowymi danymi, co serwer zna: oznacza, że ​​powinienem traktować to jak PUT.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Dziękuję Ciro za uwagę i odpowiedź, więc mogę rozważyć taki scenariusz: POST jest uniwersalną rzeczą, która zawiera w sobie rzeczywiste POST, PUT, PATCH i DELETE, a jeśli użyjesz POST na początku bez ukrytego, to oznaczałoby to faktyczny POCZTA. Ale jeśli używasz POST z ukrytym (PUT lub DELETE), to dajesz serwerowi informację, że chcesz użyć PUT lub DELETE, które są wewnątrz POST, ponieważ jego dzieci w nim znam nieco dziwną analogię, ale czy to prawda? :)
Mirich
1
@Mirich, tak, myślę, że masz pomysł.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
przepraszam, Ciro, ostatnia rzecz, zastanawiam się, dlaczego PUT i DELETE zostały usunięte z HTML5, ponieważ czy nie byłoby lepiej, gdybyś mógł po prostu użyć PUT lub DELETE na początku tagu formularza i nie używać ukrytego. Czy możesz krótko i jasno wyjaśnić, jaki był rzeczywisty powód usunięcia PUT i DELETE. Z góry dziękuję :)
Mirich
15

Uważam, że te komentarze odnoszą się konkretnie do przeglądarek, tj. Klikania linków i przesyłania formularzy, a nie XMLHttpRequest. XMLHttpRequestjest po prostu zwyczaj, że klient Ci napisałem w JavaScript, który korzysta z przeglądarki jako starcie.

AKTUALIZACJA: Aby wyjaśnić, nie miałem na myśli (choć pisałem), że napisałeś XMLHttpRequest; Miałem na myśli, że napisałeś kod, który używa XMLHttpRequest. Przeglądarki nie obsługują natywnie XMLHttpRequest. XMLHttpRequestpochodzi z środowiska wykonawczego JavaScript, które może być obsługiwane przez przeglądarkę, chociaż nie jest to wymagane (patrz Rhino ). Dlatego ludzie twierdzą, że przeglądarki nie obsługują PUTi - DELETEponieważ w rzeczywistości obsługuje je JavaScript.

Hank Gay
źródło
XMLHttpRequest to standardowy obiekt w modelu obiektowym JavaScript.
Jacob Krall,
9
@Jacob To prawda, ale różne przeglądarki mają różne silniki JavaScript. Wiedza, które z nich obsługują PUT, jest nadal pomocna.
senfo
1
it's actually JavaScript that is supporting them. Niezupełnie prawda. XMLHttpRequestto „obiekt-host”, co oznacza, że ​​jest to obiekt, który udostępnia funkcjonalność od hosta do kodu JavaScript. To nie jest część samego JS.
Stijn de Witt
9

TAK , PUT, DELETE, HEAD itp. Metody HTTP są dostępne we wszystkich nowoczesnych przeglądarkach.

Aby zachować zgodność z XMLHttpRequest poziom 2, przeglądarki muszą obsługiwać te metody. Aby sprawdzić, które przeglądarki obsługują XMLHttpRequest poziom 2, zalecam CanIUse:

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

Tylko Opera Mini nie ma obsługi bankomatów (juli '15), ale Opera Mini nie obsługuje wszystkiego. :)

Stijn de Witt
źródło
7

Wystarczy dodać - Safari 2 i wcześniejsze zdecydowanie nie obsługiwały funkcji PUT i DELETE. Mam wrażenie, że 3, ale nie mam go już do przetestowania. Safari 4 zdecydowanie obsługuje PUT i DELETE.

jharlap
źródło
5
Czy ktoś może potwierdzić, która wersja Safari uzyskała obsługę PUT i DELETE?
mjs,
1
Czy każdy może rozwinąć kwestię, czy wszystkie przeglądarki TERAZ obsługują PUT & DELETE - i mniej więcej jak długo jest ona dostępna. Zwracając uwagę na przykład „KURCZAKA”, czy to oznacza, że ​​decyzja o tym, która metoda jest używana, zależy wyłącznie od serwera, a JavaScript nie ogranicza typu metody…?
Cody