2012-03-28 13 views
4

Ich habe eine Menge Beispiele gesehen, wie man URLs für grundlegende CRUD-Operationen strukturiert, aber sehr wenig gesehen hat, wenn es um Command-ähnliche Operationen oder Application Service Calls geht.Korrekte RESTful-URL-Konvention für Anwendungsdienstanrufe?

Zum Beispiel, in meinem Anwendungsdienst habe ich einen Anruf wie RemoveOldOrders (int customerId), die jede Bestellung aus dem System entfernen würde, die älter als 2 Jahre für einen Kunden mit der ID "customerId" ist. Wie würde die URL bei meinem erholsamen Service aussehen? Wie würde die Nutzlast des Anrufs aussehen? Welche HTTP-Methode (POST?) Würde ich verwenden?

Mein Gedanke ist, wäre es so etwas wie diese:

/Kunde/1/RemoveOldOrders als POST, mit einem leeren Körper (wie die customerID aus der URL kommen würden).

Gibt es gute Richtlinien für so etwas?

Update: Ich habe das Gefühl, ich muss meine Frage ein bisschen anstelle der Bemerkung über eine mögliche doppelte Post klären (Ja, dieser Beitrag fragt im Wesentlichen das Gleiche, aber ich glaube nicht, dass die Frage gut beantwortet wurde).

Was passiert, wenn ich eine Operation für eine Ressource ausführen möchte, diese Operation aber nicht in die Standard-HTTP-Verben passt?

Ein anderes Beispiel: meine Anwendung ist in einen ESB eingebunden und es muss eine Möglichkeit geben, eine Projektion meiner Ressource auf den ESB zur Verarbeitung zu erzwingen? In meinem aktuellen SOAP-basierten Web-Service würde ich eine Methode, wie habe:

ExportCustomer(int customerId) 

Jetzt, im Fall eines RESTful Service, wie könnte ich diese Aktion in einem uri darstellen? Option 1 von Brian Kelly Antwort scheint die logischste, so etwas wie:

POST http://someapp/api/customer/1/export 

oder würde:

POST http://someapi/api/customer/export/1 

besser sein?

+0

wahrscheinlich doppelte Frage: http://stackoverflow.com/questions/6850187/non-crud-operations-in-a-restful-service – smcg

Antwort

2

Immer wenn Sie Verben wie "remove" modellieren möchten, sollten Sie an DELETE denken. Ähnlich, für "create" denke POST (und/oder vielleicht PUT), für "lesen" denke GET und für "update" denke PUT (oder vielleicht PATCH).

Also für Ihr Beispiel "alte Bestellungen entfernen" sollten Sie unbedingt DELETE verwenden. Jetzt besteht Ihre einzige verbleibende Herausforderung darin, die Aufträge zu identifizieren, die entfernt werden sollten. Sobald Sie das herausgefunden haben, wird sich das URI-Schema damit verbinden.

Hier sind einige Optionen:

  1. DELETE http://your-api.com/old-orders

    Hier wird die Bedeutung und den Bereich von old-orders wird durch den Server bestimmt werden erhalten diese Anfrage. Dies befreit den Client davon, dies zu tun, entfernt jedoch seine Fähigkeit, diesen Bereich zu ändern.

  2. GET http://your-api.com/order-query?days-older-than=730

    Das gibt eine Location URI von http://your-api.com/order-query-result/{some ID}, die den Satz von alten Terminen darstellt. Dann können Sie einfach einen DELETE für diesen URI ausgeben, um die alten Datensätze auf einen Schlag zu löschen.

  3. Statt den Client zwingen, sich zu erinnern Löschbefehle dieser Art ausstellen, bieten eine Art von configuration Ressource, die über Ihre API manipuliert werden können, um Feld wie purgeRecordsOlderThanDays=730, zu setzen und lassen Sie sie vom Server automatisch für Sie tun in einer cron -ähnlichen Art und Weise. Das wäre mein bevorzugter Ansatz.

+0

Ok, aber was ist, wenn das "Verb" nicht in "löschen" fällt, "create", "update" oder eine der üblichen HTTP-Aktionen? Ich habe ein armes Beispiel benutzt. Ich sehe den ähnlichen Beitrag, der als Kommentar zu meinem OP erwähnt wird, als "Ressource", aber das wäre in vielen Situationen nicht der Fall. Was ist, wenn meine Ressource noch ein Kunde ist, aber die Operation ist etwas sehr stumpf wie "Export zu ESB"? –

+2

Dann sollten Sie in Betracht ziehen, ein Substantiv aus dem Verb zu erstellen, das Ihnen Probleme bereitet, und stattdessen handeln. Um beispielsweise "In ESB exportieren" zu modellieren, könnten Sie eine ESBExporter-Ressource haben, die Sie dann "POST" ausführen können, um den eigentlichen Export durchzuführen. –

0

für den Export, dann müssen Sie das "Export" Verb entfernen und ersetzen Sie es mit einer ESB Darstellung der Ressource: -

  • GET http://someapp/customer/{id}
  • Die Antwort einen Link auf Export beinhaltet: GET http://someapp/customer/{id}/ESB
  • einsteigen, den Export Verbindung zurückgibt, die ESB-Darstellung (mit entsprechendem Inhaltstyp)
0

Zum Beispiel, in meinem Anwendungsdienst habe ich einen Anruf wie RemoveOldOrders (int customerId), die jede Bestellung aus dem System entfernen würde, die älter als 2 Jahre für einen Kunden mit der ID "customerId" ist. Wie würde die URL auf meinem erholsamen Service aussehen? Wie würde die Nutzlast des Anrufs aussehen? Welche HTTP-Methode (POST?) Würde ich verwenden?

RemoveOldOrders(int customerId) 
DELETE /oldOrders {customerId: id} 
DELETE /customer/{id}/orders?old=true 
etc... 

Sie sollen mehr über uniform interface/resource identifiers und die HTTP method specification lesen.

Die URL ist nicht wirklich wichtig. Es kommt darauf an, dass Sie eine Ressource mit Ressourcen-IDs (URLs) haben und diese mithilfe einer einheitlichen (Standard-) Schnittstelle wie dem Aufruf von HTTP-Methoden manipulieren müssen.

Verwandte Themen