2010-03-15 10 views
20

Ich bin gut in die Implementierung eines REST-Dienstes (auf einer Windows CE-Plattform, wenn das wichtig ist) und ich begann mit IBM's general definitions von POST zum Erstellen (INSERTs) und PUT für die Aktualisierung zu verwenden.REST Verben - welche Konvention ist "korrekt"

Jetzt bin ich über Sun's definitions gelaufen, die genau das Gegenteil sind. Meine Frage ist also, welche ist die "allgemein akzeptierte" Definition? Oder gibt es sogar einen?

+0

Mache dies bitte zu einem Community-Wiki, da "allgemein akzeptiert" schwer zu definieren ist. –

Antwort

20

Der Nachteil der Verwendung von PUT zum Erstellen von Ressourcen besteht darin, dass der Client die eindeutige ID angeben muss, die das Objekt darstellt, das erstellt wird. Während es normalerweise möglich ist, dass der Client diese eindeutige ID generiert, bevorzugen die meisten Anwendungsentwickler, dass ihre Server (normalerweise über ihre Datenbanken) diese ID erstellen. In den meisten Fällen möchten wir unseren Server die Generierung von Ressourcen-IDs steuern. Also, was machen wir? Wir können zur Verwendung von POST anstelle von PUT wechseln.

Also: Put = UPDATE

Beitrag = INSERT

+1

+1 Zum Problem der Schlüsselerstellung. –

+0

Während dies einen guten Grund dafür gibt, warum jemand Post for Insert verwenden könnte, stellt dies dies nicht wirklich als Standard fest. Die ID-Generierung ist kein Problem für jeden, der Guids verwendet. Vielleicht ist die richtige Antwort, dass es keinen allgemein akzeptierten Standard gibt. Sie können die HTTP-Verben so verwenden, wie Sie es für am besten geeignet halten, um einen Service zu implementieren, der die REST-Prinzipien erfüllt. –

2

Wir verwenden POST = Erstellen, PUT = Update.

Warum? Es gibt keine gute Grund. Wir mussten uns eins aussuchen, und das war meine Entscheidung.

Bearbeiten. Wenn ich mir andere Antworten ansehe, wird mir klar, dass das Hauptproblem die Entscheidung treffen könnte.

Wir POST neue Einträge und geben ein JSON-Objekt mit dem generierten Schlüssel zurück. Es scheint, dass dies besser zu einer allgemein akzeptierten POST-Semantik passt.

Wir PUT zu vorhandenen Einträge mit einem vollständigen URI, der das Objekt identifiziert.

+0

Grundsätzlich wählen Sie einfach eine und führen Sie sie dann aus. Das, was ich (unabsichtlich) tat - wollte nur sicherstellen, dass ich nicht alle meine Kunden verwirren würde, indem ich das Gegenteil der üblichen Praxis wählte. – ctacke

+0

"Kunden"? Bitte aktualisieren Sie Ihre Frage, um zu erklären, wer möglicherweise verwirrt ist. –

+1

Mit "Kunde" meine ich, wenn ich diesen Service für meinen Kunden erstelle (wer für die Arbeit bezahlt, nicht die Service Consumer App), dann gehen sie weiter und wollen es erweitern und weitere Dienste hinzufügen, die sie nicht enden lassen Das Gefühl, dass ich POST/PUT benutze, ist von allem anderen, das sie als Beispiele sehen, zurückgeblieben. – ctacke

5

PUT kann für die Erstellung verwendet werden, wenn der Server den Client Kontrolle über einen Teil seiner URI Raum gewährt. Dies entspricht der Dateierstellung in einem Dateisystem: Wenn Sie eine Datei speichern, die noch nicht existiert, erstellen Sie sie, und wenn diese Datei existiert, ist das Ergebnis ein Update.

Allerdings fehlt PUT die Fähigkeit einer impliziten Absicht des Clients. Ziehen Sie eine Bestellung in Betracht: Wenn Sie PUT/orders/my-new-order eingeben, kann die Bedeutung immer nur die durch/orders/my-new-order angegebene Ressource aktualisieren, während POST/orders/bedeuten kann, dass ein neuer Auftrag vergeben wird Die POST-akzeptierende Ressource weist die entsprechende Semantik auf.

IOW, wenn Sie etwas als Nebeneffekt der Erstellung der neuen Ressource erreichen möchten, müssen Sie POST verwenden.

Jan

16

Der Grund POST als INSERT zu verwenden und als Update-PUT ist, dass der einzige nonidempotent POST und unsicherer Betrieb ist gemäß HTTP. Idempotent bedeutet, dass unabhängig davon, wie oft Sie die Operation anwenden, das Ergebnis immer dasselbe ist. In SQL ist INSERT die einzige nicht-identitätsfähige Operation und sollte daher auf POST abgebildet werden. UPDATE ist idempotent, so dass es auf PUT gemappt werden kann. Dies bedeutet, dass dieselbe PUT/UPDATE-Operation mehr als einmal angewendet werden kann, aber nur zuerst den Zustand unseres Systems/unserer Datenbank ändert.

Wenn Sie daher PUT für INSERT verwenden, wird die semantische HTTP-Anforderung, dass die PUT-Operation idempotent sein muss, unterbrochen.

+0

Nicht ganz richtig. Wenn Sie sich Cristian Boarius Antwort ansehen.Wenn PUT zum Einfügen verwendet wird, während der Client die ID bereitstellt, würde das zweite PUT mit der gleichen ID die neu erstellte Ressource überschreiben, anstatt ein neues zu erstellen. Dies würde die Operation idempotent halten. –

2

Hier http://www.w3.org/Protocols/rfc2616/rfc2616.html ist die offizielle Anleitung, wie Sie das Verhalten der HTTP-Methoden implementieren.

+1

Seroiusly? Ihre Antwort ist "Lesen Sie den gesamten HTTP RFC"? Es wird nicht über REST oder die Standardkonventionen gesprochen, die heute für die Implementierung von RESTful-Diensten verwendet werden. Ich habe den Webserver geschrieben, auf dem ich arbeite, also weiß ich, wie HTTP funktioniert. Ich versuche Best Practices zu verwenden, wenn ich einen REST-Service auf diesem Server implementiere. – ctacke

+1

Nein, um zu verstehen, wie die HTTP-Methoden funktionieren, müssen Sie nur die Teile auf den HTTP-Methoden lesen :-P. Eine der REST-Einschränkungen, Uniform Interface, impliziert im Grunde, dass RTF über HTTP dann RFC2616 Ihre Bibel ist. Vielleicht, was Sie suchen, ist die REST Cookbok, die eine Reihe von Standard-Rezepte für die Lösung allgemeiner Probleme in RESTful-Systemen sind. Http://www.amazon.com/RESTful-Web-Services-Cookbook-Scalability/dp/0596801688/ ref = sr_1_1? dh = UTF8 & s = books & qid = 1268695534 & sr = 8-1 –

6

Die Verben sind:

GET {path}: Abrufen der Ressource, deren Kennung {path}.

PUT {path}: Erstellen oder aktualisieren Sie die Ressource mit der ID {path}.

DELETE {path}: Löschen Sie die Ressource, deren Kennung {path} ist.

POST {path}: Rufen Sie eine Aktion auf, die von {path} identifiziert wird.

Wenn die Absicht, eine neue Ressource zu erstellen, können wir PUT verwenden, wenn wir wissen, was die Kennung der Ressource sein sollte, und wir können POST verwenden, wenn wir den Server zu bestimmen, die Kennung der neuen Ressource wollen.

+0

Ihre Definition von POST widerspricht den beiden Dokumenten, mit denen ich verlinkt bin. Es scheint auch zu zeigen, ein Verb zu verwenden, das, glaube ich, entmutigt wird – ctacke

+1

Sie haben Recht. Meine Definition widerspricht den Definitionen von IBM und Sun, weil sowohl IBM als auch Sun es falsch verstanden haben. Bitte beachten Sie die Tabelle mit Beispielen und Bedeutungen unter http://en.wikipedia.org/wiki/Representational_State_Transfer#RESTful_web_services – yfeldblum

+0

Bitte beachten Sie, dass "GET", "PUT" und "DELETE" Standard-Hashtable sind (JavaScript-Objekt, Ruby-Hash, Python dict) Operationen. Auf Hashtabellen sind diese Methoden alle idempotent. Umgekehrt ruft 'POST' das Bild des Aufrufs einer komplexen Methode für einen Dienst auf, anstatt eine einfache Operation für eine Hashtabelle auszuführen. In der Tat ist "POST" für alle Anwendungsfälle vorgesehen, bei denen die drei einfachen Hashtable-Operationen ("GET", "PUT" und "DELETE") nicht ausreichen. – yfeldblum

1

Ich habe in letzter Zeit viel über die Konzepte und Implementierungen von REST gelesen und der allgemeine Konsens scheint zu sein: PUT wird zum Erstellen/Aktualisieren verwendet, abhängig davon, ob die Ressource bereits existiert oder nicht. POST wird verwendet, um eine Ressource an eine Sammlung anzuhängen.

Siehe HTTP/1.1 Methodendefinitionen http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

POST gestaltet ist ein einheitliches Verfahren zu ermöglichen, die folgenden Funktionen abdecken:

- Annotation of existing resources; 

    - Posting a message to a bulletin board, newsgroup, mailing 
    list, or similar group of articles; 

    - Providing a block of data, such as the result of submitting a 
    form, to a data-handling process; 

    - Extending a database through an append operation. 

das PUT Verfahren fordert, dass die umschlossene Einheit unter gespeichert werden die gelieferte Anfrage-URI. Wenn sich der Anfrage-URI auf eine bereits vorhandene -Ressource bezieht, sollte die beigefügte Entität als eine modifizierte -Version der auf dem Ursprungsserver befindlichen Version betrachtet werden.

Siehe auch die akzeptierte Antwort auf die Frage unter Understanding REST: Verbs, error codes, and authentication.

Verwandte Themen