Was ist die "RESTful" -Methode, um einem RESTful-Service Nicht-CRUD-Operationen hinzuzufügen? Angenommen, ich habe einen Dienst, der CRUD den Zugriff auf Datensätze wie diesen ermöglicht:
GET /api/car/123 <- Returns information for the Car object with ID 123
POST /api/car <- Creates a new car (with properties in the request)
PUT /api/car/123 <- Updates car 123 (with properties in the request)
DELETE /api/car/123 <- Deletes car 123
POST /api/car/123/wheel/ <- Creates a wheel and associates it to car 123
Wenn ich die Farbe des Autos ändern möchte, würde ich einfach POST /api/car/123
eine POST-Variable für die neue Farbe einfügen.
Angenommen, ich möchte ein Auto kaufen, und dieser Vorgang ist komplizierter als das einfache Aktualisieren der Eigenschaft "Eigenes Auto" eines "Benutzer" -Datensatzes. Ist es RESTful, einfach so etwas zu tun POST /api/car/123/purchase
, bei dem "Kauf" im Wesentlichen ein Methodenname ist? Oder sollte ich ein benutzerdefiniertes HTTP-Verb verwenden, wie PURCHASE
anstelle von POST
?
Oder liegen Nicht-CRUD-Operationen vollständig außerhalb des Bereichs von REST?
quelle
PATCH /api/car/123
, einen Farbparameter zu verwendenPUT /api/car/123
und zu senden ODER das gesamte Autoobjekt zu verwenden und zu senden. POST würde schließen, dass Sie ein neues Auto erstellen und sollte wahrscheinlich nie eine ID am Ende der URLAntworten:
Stellen Sie sich den Kauf als Geschäftseinheit oder Ressource im RESTful-Wörterbuch vor. Abgesehen davon schafft ein Kauf tatsächlich eine neue Ressource. So:
wird eine neue Bestellung aufgeben. Die Details (Benutzer, Auto usw.) sollten durch die ID (oder URI) in den an diese Adresse gesendeten Inhalten angegeben werden.
Es spielt keine Rolle, dass die Bestellung eines Autos nicht nur ein einfaches EINFÜGEN in die Datenbank ist. Bei REST geht es eigentlich nicht darum, Ihre Datenbanktabellen als CRUD-Operationen verfügbar zu machen. Aus logischer Sicht erstellen Sie eine Bestellung (Kauf), aber die Serverseite kann so viele Verarbeitungsschritte ausführen, wie sie möchte.
Sie können das HTTP-Protokoll sogar noch weiter missbrauchen. Verwenden Sie den
Location
Header, um einen Link zu einer neu erstellten Bestellung zurückzugeben, wählen Sie sorgfältig die HTTP-Antwortcodes aus, um Benutzer über Probleme (server- oder clientseitig) usw. zu informieren.quelle
Der RESTful-Weg, wie ich es verstehe, ist, dass Sie keine neuen HTTP-Verben benötigen. Irgendwo gibt es ein Substantiv, das bedeutet, was Sie tun müssen.
Ein Auto kaufen? Ist das nicht so?
quelle
Was Sie wirklich tun, ist eine Bestellung zu erstellen. Fügen Sie also eine weitere Ressource für Bestellung und Post hinzu und legen Sie diese während des Bestellvorgangs dort ab.
Denken Sie eher an Ressourcen als an Methodenaufrufe.
Um die Bestellung abzuschließen, würden Sie wahrscheinlich POST / api / order // complete oder ähnliches.
quelle
Ich bin der Meinung, dass REST-APIs viel mehr helfen als nur Semantik bereitzustellen. Daher kann der RPC-Stil nicht ausgewählt werden, nur weil einige Aufrufe im RPC-Betriebsstil sinnvoller erscheinen. Beispiel ist die Google Maps-API, um Wegbeschreibungen zwischen zwei Orten zu finden. Sieht folgendermaßen aus: http://maps.googleapis.com/maps/api/directions/json?origin=Jakkur&destination=Hebbal
Sie hätten es "findDirections" (Verb) nennen und es als Operation behandeln können. Vielmehr machten sie "Richtung" (Substantiv) als Ressource und behandelten das Finden von Richtungen als eine Abfrage in der Richtungsressource (obwohl es intern keine echte Ressource namens Richtung geben konnte und es von der Geschäftslogik implementiert werden konnte, Richtungen basierend auf Parametern zu finden).
quelle