it-swarm.com.de

Sollte eine RESTful 'PUT'-Operation etwas zurückgeben

Ich habe mich gefragt, was die Meinungen der Leute zu einer RESTful PUT -Operation sind, die im Antworttext nichts (null) zurückgibt.

385
AwkwardCoder

Die HTTP-Spezifikation ( RFC 2616 ) enthält eine Reihe von Empfehlungen, die anwendbar sind. Hier ist meine Interpretation:

  • HTTP-Statuscode 200 OK für ein erfolgreiches PUT einer Aktualisierung einer vorhandenen Ressource. Es wird kein Antworttext benötigt. (Per Abschnitt 9.6 , 204 No Content ist noch passender.)
  • HTTP-Statuscode 201 Created für ein erfolgreiches PUT einer neuen Ressource, wobei der spezifischste URI für die neue Ressource im Feld Standortheader und alle anderen relevanten URIs und Metadaten der Ressource im Antworttext wiedergegeben werden. ( RFC 2616, Abschnitt 10.2.2 )
  • HTTP-Statuscode 409 Conflict für einen PUT, der aufgrund einer 3 nicht erfolgreich istrd-Party-Änderung mit einer Liste der Unterschiede zwischen der versuchten Aktualisierung und der aktuellen Ressource im Antworttext. ( RFC 2616, Abschnitt 10.4.1 )
  • HTTP-Statuscode 400 Bad Request für ein nicht erfolgreiches PUT mit natürlichem Text (z. B. Englisch) im Antworttext, der erklärt, warum das PUT fehlgeschlagen ist. ( RFC 2616, Abschnitt 10.4 )
557
system PAUSE

Im Gegensatz zu den meisten Antworten hier denke ich, dass PUT die aktualisierte Ressource zurückgeben sollte (zusätzlich zum HTTP-Code natürlich).

Der Grund, warum Sie die Ressource als Antwort für den PUT-Vorgang zurückgeben möchten, liegt darin, dass der Server beim Senden einer Ressourcendarstellung an den Server auch einige Verarbeitungsschritte auf diese Ressource anwenden kann, sodass der Client wissen möchte, wie diese Ressource funktioniert Es sieht so aus, als ob die Anfrage erfolgreich abgeschlossen wurde. (Andernfalls muss eine weitere GET-Anforderung ausgegeben werden.).

147
LiorH

Ich denke, es ist möglich, dass der Server Inhalte als Antwort auf einen PUT zurückgibt. Wenn Sie ein Antwortumhüllungsformat verwenden, das seitlich geladene Daten zulässt (z. B. das Format, das von glühenden Daten verwendet wird), können Sie auch andere Objekte einbeziehen, die möglicherweise über Datenbank-Trigger usw. geändert wurden Anzahl der Anfragen, und dies scheint ein guter Ort, um zu optimieren.)

Wenn ich nur den PUT akzeptiere und nichts zurückzumelden habe, verwende ich den Statuscode 204 ohne Textkörper. Wenn ich etwas zu melden habe, verwende ich den Statuscode 200 und füge einen Body hinzu.

2
shaunc

Die HTTP/1.1-Spezifikation (Abschnitt 9.6) beschreibt die entsprechenden Antwort-/Fehlercodes. Es wird jedoch nicht auf den Inhalt der Antwort eingegangen.

Was würden Sie erwarten? Ein einfacher HTTP-Antwortcode (200 usw.) scheint mir unkompliziert und eindeutig zu sein.

2
Brian Agnew

Ich habe RESTful API in meinen Diensten verwendet, und hier ist meine Meinung: Zuerst müssen wir zu einer gemeinsamen Ansicht gelangen: PUT wird verwendet, um eine Ressource zu aktualisieren, die nicht erstellt oder abgerufen wird.

Ich habe Ressourcen definiert mit: Stateless resource und Stateful resource:

  • Zustandslose Ressourcen Für diese Ressourcen reicht es aus, wenn Sie den HTTP-Code mit leerem Text zurückgeben.

  • Zustandsbehaftete Ressourcen Zum Beispiel: die Version der Ressource. Für diese Art von Ressourcen müssen Sie die Version angeben, wenn Sie sie ändern möchten. Geben Sie also die vollständige Ressource oder die Version an den Client zurück, damit der Client nach der Aktualisierungsaktion keine Abrufanforderung senden muss.

Aber , für einen Dienst oder ein System, behalte es simple, clearly, easy to use and maintain ist das Wichtigste.

1
Bruce

HTTP-Antwortcode 201 für "Erstellt" zusammen mit einem "Speicherort" -Header, der darauf verweist, wo der Client die neu erstellte Ressource finden kann.

1
dc360

Wenn das Backend der REST API eine relationale SQL-Datenbank ist, dann

  1. sie sollten RowVersion in jedem Datensatz haben, der aktualisiert werden kann (um das verlorene Aktualisierungsproblem zu vermeiden)
  2. sie sollten immer eine neue Kopie zurückgeben des Datensatzes nach PUT (um die neue RowVersion zu erhalten).

Wenn Sie sich nicht um verlorene Updates kümmern oder Ihre Clients zwingen möchten, unmittelbar nach einem PUT ein GET durchzuführen, geben Sie nichts von PUT zurück.

0
John Henckel