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:
- http://www.packetizer.com/ws/rest.html
- http://www.mail-archive.com/[email protected]/msg13518.html
- http://www.xml.com/cs/user/view/cs_msg/1098
Jednak kilka szybkich testów w Firefoksie pokazuje, że wysyłanie PUT
i DELETE
żądania działają zgodnie z oczekiwaniami - XMLHttpRequest
zakoń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?
http
cross-browser
browser
ajax
John Millikin
źródło
źródło
Odpowiedzi:
Nie. Specyfikacja HTML 5 wspomina:
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 są obsługiwane przez implementacje XMLHttpRequest (tj. Wywołania AJAX) we wszystkich głównych przeglądarkach internetowych (IE, Firefox, Safari, Chrome, Opera).
źródło
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.
źródło
XMLHttpRequest
jest standardowym obiektem w modelu obiektowym JavaScript.Według Wikipedii,
XMLHttpRequest
po 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 tymGET
,POST
,HEAD
,PUT
iDELETE
, 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” .
źródło
_method
obejście ukrytego polaUżywany w Railsach i może być dostosowany do dowolnego frameworka:
dodaj ukryty
_method
parametr do dowolnej formy, która nie jest GET ani POST: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
_method
na serwerze i zrobić dokładnie tak, jakby ta metoda została wysłana zamiast rzeczywistej POSTUzasadnienie / historia, dlaczego nie jest to możliwe: /software/114156/why-there-are-no-put-and-delete-methods-in-html-forms
źródło
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 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żywaXMLHttpRequest
. Przeglądarki nie obsługują natywnieXMLHttpRequest
.XMLHttpRequest
pochodzi 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ąPUT
i -DELETE
ponieważ w rzeczywistości obsługuje je JavaScript.źródło
it's actually JavaScript that is supporting them
. Niezupełnie prawda.XMLHttpRequest
to „obiekt-host”, co oznacza, że jest to obiekt, który udostępnia funkcjonalność od hosta do kodu JavaScript. To nie jest część samego JS.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. :)
źródło
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.
źródło