2014-10-15 5 views
5

Wenn ich ein UUID bin mit dem Unternehmen als Teil meiner URI meines REST-Endpunkt zu identifizieren:REST PUT vs POST mit UUID

/entities/<uuid>/ 

und dass UUID vom Client generiert wird, wenn neue Objekte zu schaffen, ist gibt es eine Best Practice soweit PUT vs POST zu verwenden? Mit anderen Worten, die UUID wird vom Client im Gegensatz zum Server generiert.

Wenn ich PUT verwenden würde, wird erwartet, dass die Nachrichtennutzlast auch die UUID enthält? In diesem Fall enthalten sowohl die Nachricht als auch der URI, der die Entität identifiziert, das UUID.

Für spec finden: die REST RFC

+1

Sie verwechseln "REST" mit "HTTP". Es gibt keinen "REST RFC". Es gibt einen "HTTP RFC", aber heutzutage ist es nicht mehr RFC 2616. –

Antwort

3

Da Sie (der Kunde) bereits die UUID wissen, würde ich sagen PUT ist die beste Praxis, und Sie brauchen nicht UUID in der Nutzlast enthalten. Zugegeben, PUT vs POST ist etwas kontrovers und das Lesen und erneutes Lesen der RFC ist nicht völlig klar für mich. Aber ich denke, das Vorhergehende ist Orthodoxie.

Siehe PUT vs POST in REST für eine nette Diskussion.

+0

Stimmt es, dass "Sie UUID nicht in die Payload aufnehmen müssen"? Das scheint zu widersprechen, was @nikita über die Notwendigkeit der Aufnahme der UUID gesagt hat, da es Teil der Darstellung der Ressource ist. –

+0

Der Name der Ressource muss nicht Teil der Repräsentation sein. –

0

Der Hauptunterschied zwischen POST und PUT:

POST wird verwendet, um neue Einheiten anzuhängen. POST ist nicht idempotent. Das bedeutet, wenn Sie eine POST-Anfrage zehn Mal senden, erstellen Sie zehn verschiedene Entitäten. Normalerweise sollten Sie den Antwortcode 201 (Created) an die POST-Anforderung senden, die mit dem Location-Header verbunden ist, der auf die URL der neu erstellten Ressource zeigt. In Ihrem Fall schlage ich vor, wie

POST /entities/ HTTP/1.1 
Content-Type: application/json 
{ 
    UUID: <UUID>.. 
    OtherStuff: ... 
} 

Antwort auf URL STHM POST:

HTTP/1.1 201 Created 
Location: http://www.myREST/entities/<uuid>/ 

PUT Anfrage verwendet wird, bestehenden Zustand zu ändern. PUT ist idempotent. Normalerweise erhalten Sie 200 (OK) Antwortcode.

Sie müssen UUID in PUT/POST-Nutzdaten enthalten. UUID ist Teil der Darstellung Ihrer Ressource. PUT und POST übertragen beide Repräsentationen auf den REST-Server, um den Ressourcenstatus zu ändern/anzufügen.

BTW sollten Sie nicht URI Begriff in REST verwenden. URI ist sthm, das keine Repräsentation hat, obwohl URL immer Repräsentation hat.

+0

Wenn ich eine Eindeutigkeitseinschränkung für UUID habe, ändert das nichts (Dies ist im Wesentlichen ein Muss, da ich darauf angewiesen bin, dass UUID eine kanonische Suche nach der Entität ist)? Wenn ich also versuche, die gleiche UUID mehrmals zu POSTIEREN, ist nur die erste erfolgreich 201. Sollte ich besorgt sein, dass, wenn ich PUT zum Erstellen verwenden würde, ich die Daten angeben würde, in denen die URL und die Nutzlast beide enthalten (hoffentlich) gleiche UUID? –

+0

1. In Ihrem Fall (da Sie UUID auf dem Client generieren) sollten nachfolgende POSTs 409 antworten (Konflikt). In jedem Fall sollten Sie UUID in POST einschließen, da der Server Sie auf die Ressource verweisen sollte, die für den Client erstellt wurde. Es erstellt es mit UUID, die Client zur Verfügung gestellt. Es ist die beste Vorgehensweise. So kommunizieren Client und Server miteinander - indem sie Darstellungen hin und her übertragen. – nikita

+0

Meinst du, du solltest die UUID in "PUT" aufnehmen? Vermutlich müssen Sie es in den POST aufnehmen, da die URL die UUID nicht enthält. –

1

Verstehen Sie den Unterschied zwischen PUT und POST.

PUT soll Ressource (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6) ersetzen, auf die der URI mit einem neuen verweist. Und es ist idempotent, d.h. wie oft Sie es mit derselben Nutzlast aufrufen, das Ergebnis ist das gleiche; Es wird dieselbe Ressource über den URI verfügbar machen.

Also, wenn die Ressource nicht dort ist, wird bereits eine neue erstellt. Selbst in diesem Fall ist das Ergebnis dasselbe, d. H. Es wird dieselbe Ressource über den URI verfügbar gemacht.

POST bedeutet, eine Unterressource (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5) für die Ressource zu erstellen, auf die der URI zeigt.Wenn die Ressource eine Liste ist, fügt sie ein Element hinzu. Wenn es ein Element ist, dann sollte es etwas zum Objekt hinzufügen, ein Attribut kann sein.

Also, im Idealfall, wenn das Element, auf das der URI verweist, nicht verfügbar ist, sollte es eine Fehlerbedingung sein. Kann ein "404" sein. Beim POST geht es darum, eine vorhandene Ressource hinzuzufügen.

Kommen zu Ihrer Frage, ist es am besten, POST mit "/ entities /" als URI wie in der obigen Beschreibung zu verwenden. Sie sollten keine nicht vorhandene Ressourcen-UUID im URI mit der POST-Methode verwenden. Wenn Sie PUT verwenden, verwenden Sie "/ entities /".

POST /entities/ HTTP/1.1 
Content-Type: application/json 
{ 
    UUID: <UUID>.. 
    OtherStuff: ... 
} 

PUT /entities/<UUID> HTTP/1.1 
Content-Type: application/json 
{ 
    UUID: <UUID>.. 
    OtherStuff: ... 
} 

Antwort sollte

HTTP/1.1 201 Created 
Location: http://www.examples.com/entities/<uuid>/ 

gleichen sein, obwohl PUT idempotent ist, aber wenn der PUT Verfahren wieder verwendet wird, dann sollte es 200 oder 204 in Reaktion verwenden.

Ihre zweite Frage: Idealerweise sollte das vollständige Ressourcendetail in der PUT-Nutzlast und nicht nur in der URI enthalten sein.

+0

Sie haben zwei Möglichkeiten zum Erstellen einer neuen Ressource vorgestellt: 'POST' ohne die UUID und' PUT' mit der UUID. Welche davon wird in diesem Fall bevorzugt, wenn die UUID clientseitig generiert wird? –

+0

Ich bevorzuge POST ohne UUID, um eine neue Ressource zu erstellen. Weil ich es so beibehalten habe, sollte ein URI immer auf eine existierende Ressource verweisen. Auf diese Weise werde ich nicht verwirrt. Auch um PUT wirklich idempotent zu machen, sollte es immer mit derselben Antwort zurückkehren, wenn die Nutzlast gleich ist. Wenn Sie jedoch eine neue Ressource mit PUT erstellen und auch mit PUT aktualisieren, werden zwei verschiedene Arten von Antworten zurückgegeben. In create ist es 201 und ansonsten ist es 200. Dies bricht die Semantik. – Jangid

Verwandte Themen