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

Widziałem kilka pytań wokół tutaj Jak debugować usługi RESTful , który wspomina:

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

Słyszałem też, że przeglądarki obsługują tylko GET I POST, z niektórych innych źródeł like:

Jednak kilka szybkich testów w Firefoksie pokazuje, że wysyłanie żądań PUT i DELETE działa zgodnie z oczekiwaniami -- XMLHttpRequest kończy się pomyślnie, a żądanie pojawia się w logach serwera przy użyciu odpowiedniej metody. Czy jest w tym jakiś aspekt? brakujące, takie jak kompatybilność między przeglądarkami lub nieoczywiste ograniczenia?

Author: Community, 2008-10-03

7 answers

Formularze HTML (do wersji HTML 4 i XHTML 1) obsługują tylko GETi POST jako metody żądania HTTP. Obejściem tego problemu jest tunelowanie innych metod przez POST za pomocą ukrytego pola formularza, które jest odczytywane przez serwer i odpowiednio wysyłane żądanie.

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

 434
Author: Matthew Murdoch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-12 19:01:12

Formularze HTML obsługują GET I POST. (HTML5 w pewnym momencie dodano PUT / DELETE, ale te zostały porzucone.)

XMLHttpRequest obsługuje wszystkie metody, w tym CHICKEN, chociaż niektóre nazwy metod są dopasowane do wielkości liter (metody są rozróżniane na wielkość liter na HTTP), a niektóre nazwy metod nie są w ogóle obsługiwane ze względów bezpieczeństwa (np. CONNECT).

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

 75
Author: Anne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-27 13:35:33

XMLHttpRequest jest standardowym obiektem w modelu obiektowym JavaScript.

Według Wikipedii, XMLHttpRequest po raz pierwszy pojawił się w Internet Explorer 5 jako obiekt ActiveX, ale od tego czasu został przekształcony w standard i został włączony do użytku w JavaScript w rodzinie Mozilli od 1.0, Apple Safari 1.2, Opera 7.60-p1 i IE 7.0.

Metoda open() na obiekcie przyjmuje metodę HTTP jako argument - i jest określona jako przyjmująca dowolną poprawną metodę HTTP (patrz pozycja numer 5 linku) - w tym GET, POST, HEAD, PUT i DELETE, zgodnie z określonym przez RFC 2616.

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

 40
Author: Vihung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-11 13:35:21

Uważam, że te komentarze odnoszą się konkretnie do przeglądarek, tj. klikania linków i przesyłania formularzy, a nie XMLHttpRequest. XMLHttpRequest jest po prostu niestandardowym klientem, któryty napisał w JavaScript, który używa przeglądarki jako środowiska uruchomieniowego.

UPDATE: dla wyjaśnienia, nie miałem na myśli (choć napisałem), że ty napisałeś XMLHttpRequest; chodziło mi o to, że napisałeś kod, który używa XMLHttpRequest. Przeglądarki nie obsługują natywnie XMLHttpRequest. XMLHttpRequest pochodzi z środowiska uruchomieniowego JavaScript, które może być hostowane przez przeglądarkę, chociaż nie jest to wymagane (patrz Rhino). Dlatego ludzie mówią, że przeglądarki nie obsługują PUT i DELETE - ponieważ to właśnie JavaScript je wspiera.

 15
Author: Hank Gay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-27 18:07:44

_method hidden field workaround

Używany w Rails i może być dostosowany do każdego frameworka:

  • Dodaj Ukryty parametr _method do dowolnego formularza, który nie jest GET lub POST:

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

    Można to zrobić automatycznie w frameworkach za pomocą metody HTML creation helper (np. Rails form_tag)

  • Napraw rzeczywistą metodę formularza, aby opublikować (<form method="post")

  • Procesy _method na serwerze i robią dokładnie tak, jakby ta metoda została wysłana zamiast z aktualnego posta

Uzasadnienie / historia dlaczego nie jest to możliwe: https://softwareengineering.stackexchange.com/questions/114156/why-there-are-no-put-and-delete-methods-in-html-forms

 13
Author: Ciro Santilli 新疆改造中心 六四事件 法轮功,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-24 07:17:56

Tylko dodać-Safari 2 i wcześniej zdecydowanie nie obsługiwało PUT and DELETE. Mam wrażenie, że 3 tak, ale nie mam go już do testowania. Safari 4 zdecydowanie obsługuje PUT and DELETE.

 8
Author: jharlap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-31 14:39:13

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

Aby być zgodnym z XMLHttpRequest Level 2 przeglądarki muszą obsługiwać te metody. Aby sprawdzić, które przeglądarki obsługują XMLHttpRequest Level 2 polecam CanIUse:

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

Tylko Opera Mini nie obsługuje atm (juli '15), ale Opera Mini nie obsługuje wszystkiego. :)

 7
Author: Stijn de Witt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-21 20:52:42