Ich muss einen Druckvorgang für meine Kundendokumente ausführen. Ich muss auch die anderen Standardoperationen ausführen, z. B. Hinzufügen, Aktualisieren, Löschen. also habe ich folgendes:
- Zum Erstellen eines neuen Kunden:
URI = / customer / {id}, geben Sie = POST, Methodenname = CreateCustomer () ein. - Zum Aktualisieren:
URI: / customer / {id}, Typ = PUT, Methode = UpdateCstomer () - Geben Sie für Kunden
löschen : URI = / customer / {id} = DELETE, Methodenname = DeleteCustomer () ein.
Geben Sie für View: URI: / customer / {id} = GET, method = GetCustomer () ein.
Wenn ich jetzt ein Dokument für diesen Kunden drucken muss, benötige ich eine Druckfunktion. Mein URI könnte folgendermaßen aussehen: / customer / {id}, type = POST, method = PrintCustomer (). Aber ich habe diesen URI- und POST-Typ für CreateCustomer verwendet. Ich wollte, dass der URI so aussieht: / customer / Print / {id}, type = POST, method = PrintCustomer ().
Aber ich kann kein "Print" -Verb in meiner URI haben. Was ist der beste Weg, dies zu tun? Ich dachte an / customer / document / {id} als URI ... aber ich werde auf dasselbe Problem stoßen. Ich hätte die CRUD-Operationen für das "Dokument". Also habe ich wieder nicht mehr das, was ich für "Drucken" verwendet hätte. Bitte beraten.
POST /customers/123/print
eine gültige Sache zu tun.Antworten:
POST
bedeutet nicht "erstellen", sondern "verarbeiten". Sie können eine neue Ressource erstellen, indem Sie eine geeignete Anfrage an eine vorhandene Ressource senden (dh an senden/customers
, um einen neuen Kunden zu erstellen). Sie können aber auchPOST
alle anderen Aktionen ausfüllen, die keinem ordentlichen CRUD-Paradigma entsprechen.Beim Drucken sollten Sie den Vorgang des Druckens als Ressource selbst betrachten. Sie bitten das System, einen "Druckauftrag" für Sie zu erstellen. Dies bedeutet, dass Sie eine
prints/
Ressource haben können, die als Container für alle angeforderten Ausdrucke fungiert. Wenn Sie etwas drucken möchten, senden SiePOST
ein Dokument an diese Ressource, das alle Informationen zu dem Ausdruck enthält, den Sie erstellen möchten, und die zu druckenden Ressourcen mit Links dazu identifiziert.Als JSON-Dokument könnte es folgendermaßen aussehen:
Natürlich müssen Sie dies so anpassen, dass es für das, was Sie tun möchten, relevant ist. Der Schlüssel ist, dass Sie andere zu druckende Ressourcen durch Angabe ihrer URL identifizieren.
Als Antwort auf die Anfrage können Sie einfach ein
200 OK
oder ein zurückgeben204 No-Content
und es als einen Vorgang zum Löschen und Vergessen behandeln. Wenn Sie es jedoch erweitern möchten, können Sie201 Created
die URL des neu erstellten Druckauftrags zurückgeben und angeben, z/prints/12345
.Ein Benutzer kann dann
GET
in der Ressource eine Aktion ausführen , um den Status seines Druckauftrags (ausstehend, in Bearbeitung usw.) anzuzeigen, oder den Auftrag durch Ausgabe von abbrechenDELETE
.Sobald Sie das Problem in Bezug auf die Ressource umformuliert haben, sollte das RESTful-Design selbstverständlich sein und Ihnen die Möglichkeit geben, es auf eine Weise zu erweitern und zu verbessern, die Sie möglicherweise nicht sofort in Betracht gezogen haben.
quelle
Ich habe das schon mal gemacht. Um ein Dokument zu drucken, gebe ich einfach eine PDF-Version einer Ressource zurück. Der Client muss nur eine GET-Anforderung für die Ressource mit Accept header application / pdf senden.
So vermeiden Sie auch das Erstellen eines neuen URI für temporäre Ressourcen wie Druckaufträge. Die Verwendung des HTTP-Headers ist ebenfalls Teil von REST und hält den URI sauber.
quelle
Fügen Sie einfach einen Parameter zum GET des aktuellen URI hinzu
Es ist ziemlich typisch, einen URI für mehrere Aktionen zu verwenden.
Wenn Sie von derselben Ressource, aber einer anderen Aktion sprechen, definieren Sie sie als Parameter.
/ customer / {id}? print = true
Wenn Sie dann Ihre GET-Methode definieren, erkennen Sie das Vorhandensein des Druckparameters und behandeln ihn anders.
REST wird folgendermaßen definiert:
GET hingegen soll auf verschiedene Arten verwendet werden, da es in der Regel viele verschiedene Formen gibt, in denen eine Ressource abgerufen werden kann. Das ist auch der Grund, warum GET-Anforderungen als Abfragezeichenfolge dargestellt werden. Wenn Sie mit einer Datenbankressource gearbeitet haben, würden Sie eine Ansicht buchstäblich über eine Abfrage abrufen, REST wird jedoch absichtlich auf eine höhere Ebene abstrahiert, da es für die Verwendung mit vielen verschiedenen Ressourcentypen entwickelt wurde.
Die REST-Spezifikation ist ziemlich zukunftsweisend, obwohl APIs sie erst seit kurzem in großem Umfang verwenden.
Wenn Sie mehr über REST-Protokolle erfahren möchten, empfehlen wir Ihnen dringend, " Hasser, die HATEOAS hassen " zu lesen .
Aktualisieren:
@ Shauna wies auf eine interessante Lücke in meiner Argumentation hin. Es gibt keinen wahren richtigen Weg und viele Formen sind akzeptabel angesehen. Da Sie die Daten in eine andere Darstellung umwandeln möchten, ist es sinnvoll, die Transformation als neuen MIME-Typ zu definieren.
Beispielsweise könnten Sie den URI wie folgt darstellen:
Hier können Sie den Inhaltstyp der Antwort auf text / html + print setzen. Auf diese Weise haben Sie auch die Möglichkeit, in Zukunft weitere Transformationen zu definieren.
Beispielsweise:
In jedem Fall sind alle Formen zulässig. Die Implementierung, für die Sie sich entscheiden, hängt mehr von Ihren persönlichen Vorlieben und den Fähigkeiten Ihres Servers ab.
Nebenbei: Lassen Sie mich das klarstellen, da es Verwirrung zu geben scheint. Der 'print'-Abfrageparameter und / oder der Inhaltstyp wird verwendet, um anzugeben, wie die Ressource transformiert wird. Nicht, wie ein physischer Druckauftrag ausgelöst wird. Aus Sicherheitsgründen wird der Zugriff auf Hardwareebene immer dem Benutzer / Client / Browser überlassen.
quelle
?print=true
) können Sie auch URI-Parameter (dh -/customer/{id}/printable
) verwenden. Welche Sie verwenden, hängt weitgehend von dem Standard ab, für den Ihr System (CMS, Framework, Code im Allgemeinen) eingerichtet ist. Beide gelten als gültig und akzeptabel .