2009-07-09 6 views
37

Umsehen, ich kann nicht eine einzelne Web-Anwendung (nicht Web-Service) nennen, die alles außer GET und POST-Anfragen verwendet. Gibt es einen bestimmten Grund dafür? Bieten einige Browser (oder Server) keine anderen Arten von Anfragen? Oder ist das nur aus historischen Gründen? Ich würde gerne PUT- und DELETE-Anfragen verwenden, um mein Leben auf der Server-Seite etwas einfacher zu machen, aber ich zögere, weil es sonst niemand tut.Gibt es einen Grund, HTTP PUT und DELETE nicht in einer Webanwendung zu verwenden?

Antwort

39

Tatsächlich verwenden eine Menge Leute PUT und DELETE, meistens für Nicht-Browser-APIs. Einige Beispiele hierfür sind das Atom Publishing Protocol und die Google Data APIs:

Darüber hinaus werden Sie nicht sehen, im allgemeinen Sprachgebrauch nicht PUT/DELETE, weil die meisten Browser nicht unterstützen PUT und DELETE über Formulare. HTML5 scheint diese Fixierung werden:

So wie es für Browser-Anwendungen funktioniert, ist: Menschen entwerfen RESTful-Anwendungen mit PUT und DELETE im Auge, dann „Tunnel“ diese Anfragen durch Nachrichten von der Browser. Zum Beispiel finden Sie in diesem SO Frage, wie Ruby on Rails dies mit versteckten Feldern erreicht:

Also, würden Sie nicht auf eigene Faust sein Entwerfen Ihrer Anwendung mit dem größeren Satz von HTTP Verben im Kopf.

EDIT: Übrigens, wenn Sie neugierig sind, warum PUT/DELETE von browserbasierten Formular-Posts fehlen, stellt sich heraus, es gibt keinen wirklich guten technischen Grund. um diesen Thread liest Kommentare auf der Rest-discuss Mailingliste, vor allem Roy Fielding, ist für einigen Zusammenhang interessant:

EDIT: Es gibt einige Kommentare, ob AJAX-Bibliotheken unterstützen alle Methoden . Es kommt auf die eigentliche Browser-Implementierung von XMLHttpRequest zurück. Ich dachte, dass jemand diesen Link nützlich finden könnte, der Ihren Browser testet, um zu sehen, wie kompatibel das HttpRequest-Objekt mit verschiedenen HTTP-Optionen ist.

Leider weiß ich nicht, von einer Referenz, die diese Ergebnisse sammelt.

+6

Rate mal was? In der neuesten Version (19. Oktober 2010) scheint die PUT/DELETE-Unterstützung in HTML5 entfernt worden zu sein. http://www.w3.org/TR/html5/forms.html#form-submission-0 –

+0

@Xie: Interessante finden. Scheint kontraproduktiv zu mir ... –

3

Einige Proxy-Server mit strengen Sicherheitsrichtlinien können sie fallen lassen. Ich benutze sowieso PUT und DELETE.

3

Ich habe gelesen, dass einige Browser andere HTTP-Methoden nicht richtig unterstützen, obwohl ich keine Besonderheiten nennen kann.

Insbesondere Schienen werden Ihre Formulare mit einem Methodenparameter packen, um dies explizit festzulegen, auch wenn der Browser diese Methoden nicht unterstützt. Das scheint eine vernünftige Vorsichtsmaßnahme zu sein, wenn Sie das tun.

9

Ganz einfach, die HTML 4.01 form element erlaubt nur die Werte "POST" und "GET" in seinem method Attribute

+0

Hmm, das würde Sinn machen ... Aber das gilt nicht für Ajax-Anfragen, oder? Ich kann verwenden, was auch immer ich will? –

+0

Wenn der Browser nach der Spezifikation HTML 4.01 erstellt wird, versteht er nichts anderes als die Spezifikation. Das ist alles, was Sie von einem Browser erwarten können – Gareth

+3

Browser sind in der Regel mit mehr als nur einer HTML-Spezifikation gebaut - JavaScript ist nicht Teil von HTML 4.01. – aehlke

0

Dies ist in Ihrem Browser und Ajax-Bibliothek abhängt. Zum Beispiel unterstützt jQuery alle HTTP-Methoden, obwohl der Browser möglicherweise nicht. Siehe zum Beispiel das jQuery "ajax" documentation für das Attribut "type".

Das Java-Framework Restlet ermöglicht das Tunneln von PUT- und DELETE-Anforderungen über HTML-POST-Vorgänge. Um dies zu tun, müssen Sie nur Methode hinzufügen = setzen oder method = löschen, um Ihren URI Query-String, zB:

http://www.example.com/user=xyz?method=delete ... 

Dies ist die gleiche wie Ruby on Rails' Ansatz (wie oben von @ars beschrieben).

+2

Aus der jQuery-Dokumentation: "Andere HTTP-Anforderungsmethoden wie PUT und DELETE können hier ebenfalls verwendet werden, aber sie werden nicht von allen Browsern unterstützt." Da liegst du falsch. –

1

Ich sage, verwenden Sie alle Funktionen von HTTP, Browser verdammt sein, lol. Vielleicht wird es eine umfassendere und korrekte Verwendung des voranschreitenden HTTP-Protokolls inspirieren. Es passiert mehr im Netz als nur POSTs und GETs. Über die Zeit spiegelten Browser-Implementierungen dies wider.

+0

Haha, ich wünschte. Leider glaube ich nicht, dass meine Webapplikation * nicht funktionieren * alles andere tun wird, als meine User zu verärgern. :) –

+0

hmmm ... ja, ich nehme an, Sie haben einen Punkt. Na ja, es war ein schöner Gedanke. – codemonkey

+2

aber warte ... es funktioniert für Microsoft ... – codemonkey

0

Persönlich sehe ich wirklich keinen Zweck für die Verwendung von PUT oder DELETE in einer Webanwendung. Alle Operationen, die eine Anwendung ausführt, sind Lese- oder Schreibvorgänge, auch als Eingabewerte bezeichnet. Warum müssen Sie die Art der Operation im Header der HTTP-Anfrage unterscheiden? Ich könnte Ajax-Aufrufe mit der gleichen URL von Formular/Objekt/Objekt-ID machen und mehrere Operationen wie Löschen, Aktualisieren, den Wert abrufen oder erstellen. Nur durch den Blick auf die URL habe ich keine Ahnung, welche es ist. von nur GET und POST verwenden, wird meine Urls sein:

/Objekt/id/

/Objekt/id/update

/Objekt/

/Objekt/id/erstellen löschen id -> impliziert GET

usw.

Aufgrund meiner begrenzten Erfahrung, das ist viel sauberer als versteckte Kopfanforderungstypen in vielen Fällen. Ich sage nicht, dass man PUT oder DELETE niemals benutzen sollte, nur zu sagen, benutze sie nur, wenn sie unbedingt benötigt werden.

Siehe "RESTful Web API" von Leonard Richardson, um mehr über verschiedene Anwendungsfälle und Konventionen bezüglich HTTP-Anforderungsmethoden in einer REST-Web-API zu erfahren.