webentwicklung-frage-antwort-db.com.de

Im REST ist POST oder PUT am besten für den Aufwärtsbetrieb geeignet?

Ich verwahre einen Schlüsselwertspeicher auf dem Server für den Client. Wenn der Benutzer den Schlüssel "k1" sendet, stelle ich ihn in die Datenbank ein. Wird dies als POST oder PUT betrachtet?

Ich habe auch eine andere Operation, die alle vorhandenen Schlüssel entfernt und den neuen Schlüssel hinzufügt. Ist dies POST oder PUT, da Datensätze gelöscht und neue hinzugefügt werden.

40
Jimmy

Wenn der Benutzer den Schlüssel "k1" sendet, stelle ich ihn in die Datenbank ein. Wird dies als POST oder PUT betrachtet.

Entsprechend der HTTP-Spezifikation :

Die PUT-Methode fordert, dass die eingeschlossene Entität unter dem angegebenen Request-URI gespeichert wird. Wenn sich der Request-URI auf eine bereits vorhandene Ressource bezieht, sollte die eingeschlossene Entität als modifizierte Version der auf dem Origin-Server vorhandenen angesehen werden. Wenn der Request-URI nicht auf eine vorhandene Ressource verweist und dieser URI vom anfordernden Benutzeragenten als neue Ressource definiert werden kann, kann der Origin-Server die Ressource mit diesem URI erstellen.

Ich denke daher, dass die Verwendung von PUT für ein Insert oder ein Update absolut legitim ist, vorausgesetzt, in beiden Fällen ist der URI im Voraus bekannt. Wenn Sie den Schlüssel als Teil der URI verwenden (als k1 in http://www.somewhere.com/resources/k1 ), sollte dies der Fall sein. Um im Idealfall REST-fähig zu sein, sollten Sie jedoch bei einem GET unter derselben URL auch die Ressource herunterladen können.

Ich habe auch eine andere Operation, die alle vorhandenen Schlüssel entfernt und den neuen Schlüssel hinzufügt. Dies ist POST oder PUT, da dies die Einträge löscht und einen neuen hinzufügt.

Ich glaube nicht, dass diese Operation als REST-fähig betrachtet werden kann, weil sie zwei Dinge tut. Es scheint, ein Makro zur Verfügung zu stellen, um die Bedürfnisse eines bestimmten Kunden zu befriedigen, anstatt einen einfachen Zugriff auf Daten zu erhalten. Ein Standard RESTful Design wäre 

  1. Abrufen einer Liste von Schlüsseln durch Senden eines GET an die übergeordnete URL. Im obigen Beispiel wäre dies http://www.somewhere.com/resources
  2. Löschen Sie jeden dieser Schlüssel, indem Sie ein DELETE an http://www.somewhere.com/resources/k1 senden.
  3. Hinzufügen des Ersatzes durch Senden eines PUT an http://www.somewhere.com/resources/k2 .

Es ist weniger eindeutig, aber ich denke, es wäre auch legitim, alle Ressourcen durch Senden einer einzigen DELETE-Anforderung an http://www.somewhere.com/resources zu löschen.

57
Polly Shaw

Die Antwort von Polly Shaw ist korrekt, aber ich möchte erwähnen, dass angesichts der Tatsache, dass die Nachricht sehr wahrscheinlich unvollständig ist (die ID fehlt, wenn die Ressource noch nicht erstellt wurde), ein Verb PATCH etwas richtiger wäre.

https://tools.ietf.org/html/rfc5789

Dies ist extrem fein abgestimmt.

0
ecoologic

Die Idee hinter dem Aufwärtsbetrieb ist, dass Kunden Informationen über die Datenstruktur und das Senden von Daten mit Schlüsselwert haben/entscheiden. Das Anfragemodell für den Upsert-Vorgang ist dem Update-Vorgang mit dem im folgenden Beispiel enthaltenen Schlüssel sehr ähnlich:

/customers/jimmy

Die erwartete Methode zum Aktualisieren eines vorhandenen Datensatzes ist PUT. Ihre Wahl sollte also PUT sein.

POST wird im Allgemeinen zum Einfügen eines neuen Datensatzes mit brandneuen Inhalten wie im folgenden Beispiel verwendet:

POST /customers HTTP/1.1
Content-Type: ...
Content-Length: ...
Host: server.yourdomain.com
Accept: ...
User-Agent: ...

id      jimmy
name    jimmy
Occupation   Stackoverflower

In Ihrem Fall benötigen Sie also keine POST -Operation, da PUT für die Aufwärtsoperation dies ebenfalls abdeckt. 

Hier ist die kritische Frage zu upsert, wie wahrscheinlich Sie Ihrem Kunden beim Upsert-Vorgang anvertrauen. Wenn ein Kunde einen neuen Datensatz mit einem vorhandenen Schlüssel einfügen möchte, was passiert dann? In Ihrem Fall sollten Sie diese Anforderung als Aktualisierung behandeln, da sowohl die Einfüge- als auch die Aktualisierungsanforderung an dieselbe API gesendet werden und Sie über einen vorhandenen Datensatz verfügen. Dies ist die von Ihnen zu beantwortende Frage zum Design.

0
Tahsin Turkoz