2013-05-08 8 views
7

Ich entwerfe eine einfache CRUD-REST-API. Dies ist mein erstes Mal, also wollte ich ein Feedback darüber bekommen, ob mein Design Sinn macht.So entwerfen Sie eine einfache CRUD-REST-API

Ich verwende die HTTP-Methoden: GET, POST, DELETE und UPDATE. Die API wird Daten im JSON-Format konsumieren und abrufen. Die Beispiel-URL wird wie folgt aus:

GET (list): curl http://<domain>/myapp/rest/v1/colors 
POST: curl -XPOST http://<domain>/myapp/rest/v1/colors -d '{ 
     "name": "red", 
     "shade": "light" 
     }' 
GET (single item): curl http://<domain>/myapp/rest/v1/colors/2 
DELETE: curl -XDELETE http://<domain>/myapp/rest/v1/colors/2 
etc... 

Frage

Nach der POST-Anforderung wird ein Datensatz in der Datenbank angelegt werden. Also, sollte die POST-Anfrage die ID des neu erstellten Datensatzes zurückgeben? Also kann diese ID in UPDATE, DELETE and GET (single item) verwendet werden?

+0

Es hängt davon ab, wie Sie Ihren Rest Service entworfen haben. Ya, eine POST-Anfrage kann den Antworttext erhalten. – Joshi

+0

Danke, ja, ich verstehe, dass eine POST einen Körper erhalten kann. Aber kann ich eine Antwort senden, nachdem die Anfrage verarbeitet wurde und sagen, dass zum Beispiel der neu erstellte Datensatz eine ID von '659' hat – birdy

+0

Ja, Sie können diese IDs verwenden, wenn diese mit Ihrer Datenbank synchronisiert sind. – Joshi

Antwort

5

Die HTTP specification definiert die folgenden für POST:

Wenn eine Ressource auf dem Ursprungsserver erstellt wurde, sollte die Antwort 201 sein (erstellt) und eine Einheit enthalten, die den Status der Anforderung beschreibt und bezieht sich zu der neuen Ressource und einem Location-Header (siehe Abschnitt 14.30).

So bedeutet dies im Wesentlichen:

  • Sie 201 Created als Statuscode zurückgeben sollte
  • Sie sollten einen Location Header zurückgeben, an den URI zeigt der neu erstellten Ressource
  • Sie optional enthalten können eine Darstellung der Ressource in der POST-Antwortstelle, um den Client davon zu befreien, eine weitere GET Anfrage gegen den Wert ausgeben zu müssen, der aus dem Header Location erhalten wurde.
+0

, zurückgeben. so dass dritte Kugel bedeutet, dass ich einfach die neu erstellte ID – birdy

+4

Nein zurückgeben kann. Erstens ist der URI * die ID (daher der Name). Zweitens habe ich "eine Darstellung der Ressource" geschrieben, das heißt, es ist im Wesentlichen die gleiche, die Sie erhalten würden, wenn Sie dem Link in der 'Location'-Kopfzeile folgen: Die JSON, die Sie ursprünglich in Ihrem Fall gesendet haben. –

1

Der POST sollte eine Umleitung an die neue URL für den einzelnen Artikel zurückgeben.

Wahrscheinlich möchten Sie die Versionskennung der URLs verlieren.

Stattdessen entwerfen Sie Ihre Darstellungen und die Clients in einer Weise, die verschiedene Versionen anmutig behandelt. Zum Beispiel sollte ein Client nicht von einem bestimmten Format abhängig sein, sondern nur von den Attributen, die er tatsächlich benötigt.

Was in Ihrer Beschreibung fehlt, ist das HATEOAS-Prinzip, d. H. Der Client sollte keine URLs fest codieren, sondern die URLs für weitere Aktionen innerhalb der Repräsentation anderer Entitäten finden. Da Sie kein Beispieldokument für die von den URLs zurückgegebenen Ergebnisse anzeigen, können wir nicht feststellen, ob Sie das auf eine nette Weise getan haben.

Auschecken this presentation, es erklärt das Thema und erwähnt auch einige Spring-Bibliothek hilfreich für die Implementierung.

+0

Danke, mir war das HATEOAS-Prinzip nicht bewusst.Übrigens, obwohl Tags fehlen, verwende ich Grails, um dies zu erreichen. Ich füge das Tag hinzu. Statt also nur die ID zurückzugeben, sollte der Post eine vollständige URL für das einzelne Element, d.h. "http: // /myapp/rest/v1/colors/2" – birdy

Verwandte Themen