Sind die Methoden PUT, DELETE, HEAD usw. in den meisten Webbrowsern verfügbar?

608

Ich habe hier ein paar Fragen gesehen, wie man RESTful-Services debuggt , in denen Folgendes erwähnt wird:

Leider kann ich mit demselben Browser nicht HTTP PUT, DELETE und bis zu einem gewissen Grad sogar HTTP POST testen.

Ich habe auch gehört, dass Browser nur GET und POST unterstützen, aus einigen anderen Quellen wie:

Einige schnelle Tests in Firefox zeigen jedoch, dass das Senden PUTund DELETEAnfordern wie erwartet funktioniert - der XMLHttpRequestVorgang wird erfolgreich abgeschlossen, und die Anforderung wird mit der richtigen Methode in den Serverprotokollen angezeigt. Gibt es einen Aspekt, den ich vermisse, wie z. B. browserübergreifende Kompatibilität oder nicht offensichtliche Einschränkungen?

John Millikin
quelle
1
Es ist nicht nur der Client, über den Sie sich Sorgen machen müssen, viele serverseitige Frameworks unterstützen nur GET und POST.
Derby
7
John, aus irgendeinem Grund möchten Sie das REST-Tag nicht?
John Saunders
11
Obwohl Leute, die dies lesen, wahrscheinlich RESTful-APIs untersuchen.
Djjeck
Nein, nicht alle Browser unterstützen PUT / DELETE-Methoden, und auch nicht alle serverseitigen Technologien unterstützen PUT / DELETE nicht. Nur der von HTML 5 unterstützte Browser unterstützt PUT / DELETE.
Jani Devang

Antworten:

463

Nein. In der HTML 5-Spezifikation wird Folgendes erwähnt:

Die Inhaltsattribute method und formmethod sind aufgezählte Attribute mit den folgenden Schlüsselwörtern und Zuständen:

Das Schlüsselwort get , das dem Status GET zugeordnet ist und die HTTP-GET-Methode angibt. Die GET-Methode sollte nur Daten anfordern und abrufen und keine anderen Auswirkungen haben.

Das Schlüsselwort post , das dem Status POST zugeordnet ist und die HTTP-POST-Methode angibt. Die POST-Methode fordert den Server auf, die zu verarbeitenden Daten des übermittelten Formulars zu akzeptieren. Dies kann dazu führen, dass ein Element zu einer Datenbank hinzugefügt wird, eine neue Webseitenressource erstellt wird, die vorhandene Seite aktualisiert wird oder alle genannten Ergebnisse vorliegen .

Der Schlüsselwort - Dialog , mapping in den Zustand Dialog anzeigt , dass das Formular sollte das Dialogfeld , in dem die Form selbst schließen , findet, wenn überhaupt, und auch sonst nicht vor.

Der ungültige Standardwert für diese Attribute ist der GET-Status

Dh HTML-Formulare unterstützen nur GET und POST als HTTP-Anforderungsmethoden. Eine Problemumgehung besteht darin, andere Methoden durch POST zu tunneln, indem ein ausgeblendetes Formularfeld verwendet wird, das vom Server gelesen und die Anforderung entsprechend gesendet wird.

Allerdings GET , POST , PUT und DELETE werden von den Implementierungen von XMLHttpRequest (dh AJAX Anrufe) in allen gängigen Web - Browsern (IE, Firefox, Safari, Chrome, Opera) unterstützt.

Matthew Murdoch
quelle
170
Nein, ich meine definitiv HTML (ich spreche von HTML-Formularfunktionen, obwohl dies möglicherweise nicht aus dem Text hervorgeht - ich werde es bearbeiten)
Matthew Murdoch
6
@Matthew: Bedeutet dies, dass wenn ich IE6 oder IE7 mit folgendem verwende: - <form .. method = "PUT"> ... </ form> es nicht funktioniert, weil PUT für HTML 4 nicht gültig ist?
Pure.Krome
6
@ Pure.Krome (nur 14 Monate später) Nein, Sie können <form method = "put"> oder <form method = "delete"> nicht unter der HTML 4.01-Spezifikation ausführen. Nur GET und POST werden von IE8, Chrome3 oder FF3.5 unterstützt.
Jarrett Meyer
23
@porneL @Alan HTML5 fügte sie hinzu und entfernte sie dann. Derzeit sind nur GET und POST zulässig. goo.gl/8EuZk
Adam Lassek
13
@porneL HTML5 fügte sie hinzu und entfernte sie dann. Jetzt wird der Fehler erneut geöffnet. Interessanterweise habe ich einige Dokumentationen gesehen, in denen sie noch enthalten sind. Hier ist der Fehler, wenn Sie zu Hause mitmachen
Emil Lerch
79

HTML-Formulare unterstützen GET und POST. (HTML5 hat an einer Stelle PUT / DELETE hinzugefügt, aber diese wurden gelöscht.)

XMLHttpRequest unterstützt jede Methode, einschließlich CHICKEN, obwohl einige Methodennamen ohne Berücksichtigung der Groß- und Kleinschreibung abgeglichen werden (Methoden unterscheiden per HTTP zwischen Groß- und Kleinschreibung) und einige Methodennamen aus Sicherheitsgründen überhaupt nicht unterstützt werden (z. B. CONNECT).

Browser konvergieren langsam an den von XMLHttpRequest angegebenen Regeln, aber wie der andere Kommentar hervorhob, gibt es immer noch einige Unterschiede.

Anne
quelle
5
Der neueste HTML5-Entwurf scheint die PUT-
Stefan Tilkov
3
Ein Entwurf wurde vorgeschlagen, um sie zurückzubekommen: amundsen.com/examples/put-delete-forms
Joost Baaij
26
HÄHNCHEN? Der Vogel? Ich nehme an, du meinst CHECKIN. Das ist ein lustiger Vokaltausch.
JayC
52
Nein, ich meinte HÜHNCHEN, um zu veranschaulichen, dass es alles sein kann, was du willst. Einverstanden, dass der Vokaltausch lustig ist :-)
Anne
6
Für diejenigen, die genauso verwirrt sind wie ich mit diesem CHICKEN-Geschäft ... w3c-test.org/XMLHttpRequest/open-method-case-sensitive.htm
n0nag0n
43

XMLHttpRequest ist ein Standardobjekt im JavaScript-Objektmodell.

Laut Wikipedia wurde es XMLHttpRequesterstmals in Internet Explorer 5 als ActiveX-Objekt angezeigt, wurde jedoch inzwischen zu einem Standard gemacht und ist seit 1.0, Apple Safari 1.2, Opera 7.60-p1 und IE 7.0 für die Verwendung in JavaScript in der Mozilla-Familie enthalten .

Das open()Verfahren auf dem Objekt wird die HTTP - Methode als Argument - und wird als unter jeder gültigen HTTP - Methode (siehe die Positionsnummer 5 des Link) angegeben - einschließlich GET, POST, HEAD, PUTund DELETE, wie durch RFC 2616 spezifiziert .

Als Randnotiz erlaubt IE 7–8 nur die folgenden HTTP-Methoden: "GET", "POST", "HEAD", "PUT", "DELETE", "MOVE", "PROPFIND", "PROPPATCH", "MKCOL" , "COPY", "LOCK", "UNLOCK" und "OPTIONS" .

Vihung
quelle
7
Ich hoffte, einige Unterlagen zur weiteren Lektüre zu sehen. Ich würde nicht sagen, dass ich Ihnen nicht glaube. Die Links auf Wikipedia sind eigentlich ganz nett. Danke
naugtur
19

_method Problemumgehung für versteckte Felder

Wird in Rails verwendet und kann an jedes Framework angepasst werden:

  • Fügen Sie _methodjedem Formular, das nicht GET oder POST ist , einen versteckten Parameter hinzu:

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

    Dies kann in Frameworks automatisch über die Hilfsmethode zur HTML-Erstellung erfolgen (z. B. Rails form_tag).

  • Korrigieren Sie die eigentliche Formularmethode auf POST ( <form method="post")

  • Prozesse _methodauf dem Server und tun genau so, als ob diese Methode anstelle des eigentlichen POST gesendet worden wäre

Begründung / Verlauf, warum dies nicht möglich ist: /software/114156/why-there-are-no-put-and-delete-methods-in-html-forms

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
Santilli, hi dude, es ist lange her, dass du diese Lösung angeboten hast, und da ich ein Anfänger in der Webentwicklung bin, habe ich eine Frage, die du hoffentlich beantworten wirst. Sie sagten also, dass "_method auf dem Server verarbeitet und genau so vorgeht, als ob diese Methode anstelle des tatsächlichen POST gesendet worden wäre". Sie meinten, wenn eine versteckte Methode mit PUT (oder DELETE) in die Ansicht eingefügt wird, würde dies tatsächlich PUT bedeuten (oder LÖSCHEN) Anfrage richtig? Wenn ja, warum sollte man zu Beginn die POST-Methode verwenden und dann Hidden PUT oder DELETE verwenden? Was ist die Verbindung zwischen POST und PUT (oder DELETE) :)
Mirich
1
@Mirich das Formular unterstützt nur POST. Also senden wir POST mit zusätzlichen Daten, von denen der Server weiß, dass sie bedeuten: Ah, ich sollte dies wie einen PUT behandeln.
Ciro Santilli 法轮功 冠状 病 六四 事件 24
Vielen Dank, Ciro, für Ihre Aufmerksamkeit und Ihre Antwort. Kann ich dieses Szenario folgendermaßen betrachten: POST ist eine universelle Sache, die POST, PUT, PATCH und DELETE in sich trägt. Wenn Sie POST zu Beginn ohne versteckt verwenden, bedeutet dies tatsächlich POST. Wenn Sie jedoch POST mit verstecktem (PUT oder DELETE) verwenden, teilen Sie dem Server mit, dass Sie PUT oder DELETE verwenden möchten, die sich in POST als untergeordnete Elemente befinden. Ich kenne eine etwas seltsame Analogie, aber ist das richtig? :)
Mirich
1
@Mirich yup, ich denke du hast die Idee.
Ciro Santilli 法轮功 冠状 病 六四 事件 24
Entschuldigung, Ciro, als letztes, ich frage mich, warum PUT und DELETE aus HTML5 entfernt wurden, da es nicht besser wäre, wenn Sie PUT oder DELETE am Anfang des Formular-Tags verwenden und nicht versteckt verwenden könnten. Bitte können Sie kurz und klar erklären, was der eigentliche Grund für die Entfernung von PUT und DELETE war. Vielen Dank im Voraus :)
Mirich
15

Ich glaube, diese Kommentare beziehen sich speziell auf die Browser, dh auf das Klicken auf Links und das Senden von Formularen, nicht XMLHttpRequest. XMLHttpRequestist nur ein benutzerdefinierter Client, den Sie in JavaScript geschrieben haben und der den Browser als Laufzeit verwendet.

UPDATE: Um das zu verdeutlichen, habe ich nicht gemeint (obwohl ich geschrieben habe), dass Sie geschrieben haben XMLHttpRequest; Ich meinte, dass Sie den Code geschrieben haben, der verwendet XMLHttpRequest. Die Browser unterstützen nicht nativ XMLHttpRequest. XMLHttpRequeststammt aus der JavaScript-Laufzeit, die möglicherweise von einem Browser gehostet wird, obwohl dies nicht erforderlich ist (siehe Rhino ). Aus diesem Grund sagen die Leute, dass Browser dies nicht unterstützen PUTund - DELETEweil es tatsächlich JavaScript ist, das sie unterstützt.

Hank Gay
quelle
XMLHttpRequest ist ein Standardobjekt im JavaScript-Objektmodell.
Jacob Krall
9
@Jacob Stimmt, aber verschiedene Browser haben unterschiedliche JavaScript-Engines. Zu wissen, welche PUT unterstützen, ist immer noch hilfreich.
Senfo
1
it's actually JavaScript that is supporting them. Nicht wirklich wahr. XMLHttpRequestist ein 'Host-Objekt', was bedeutet, dass es ein Objekt ist, das Funktionen vom Host für Javascript-Code verfügbar macht. Es ist kein Teil von JS selbst.
Stijn de Witt
9

JA , PUT, LÖSCHEN, KOPF usw. HTTP-Methoden sind in allen modernen Browsern verfügbar.

Um mit XMLHttpRequest Level 2 kompatibel zu sein, müssen Browser diese Methoden unterstützen. Um zu überprüfen, welche Browser XMLHttpRequest Level 2 unterstützen, empfehle ich CanIUse:

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

Nur Opera Mini fehlt die Unterstützung atm (juli '15), aber Opera Mini fehlt die Unterstützung für alles. :) :)

Stijn de Witt
quelle
7

Nur um hinzuzufügen - Safari 2 und früher haben PUT und DELETE definitiv nicht unterstützt. Ich habe den Eindruck, dass 3 es getan hat, aber ich habe es nicht mehr zum Testen. Safari 4 unterstützt definitiv PUT und DELETE.

jharlap
quelle
5
Kann jemand bestätigen, welche Version von Safari Unterstützung für PUT und DELETE erhalten hat?
mjs
1
Kann jemand näher erläutern, ob JETZT alle Browser PUT & DELETE unterstützen - und wie lange dies ungefähr verfügbar ist. Bedeutet dies im Beispiel "CHICKEN", dass es vollständig Sache des Servers ist, zu interpretieren, welche Methode verwendet wird, UND dass JavaScript den Methodentyp nicht einschränkt ...?
Cody