2010-08-11 5 views
6

Ein Teil unserer RESTful-API ermöglicht es Benutzern, ein Element mit einer Seriennummer zu registrieren. Da die Seriennummer nicht global eindeutig ist, kann sie nicht als der Identifizierer der Ressource verwendet werden, so dass wir einen POST zu der Elternressource verwenden, der eine Kennung erzeugt, z.Auf eine idempotente HTTP-POST-Anforderung antworten

POST /my/items 

<item serial-number="ABCDEF" /> 

In dem Fall, in dem das Element nicht bereits registriert ist, sind die HTTP-Semantik gut definiert. Wir geben einen Location-Header und das registrierte Objekt als Entity-Body zurück, z.

HTTP 201 Created 
Location: /my/items/1234  

<item id="1234" serial-number="ABCDEF" /> 

jedoch in dem Fall, dass der Gegenstand bereits registriert ist, sollte die API idempotent und zurück, um die zuvor registrierten Artikel ohne einen neuen zu schaffen. Meine beste Vermutung ist, dass es dann einen 200-OK-Statuscode zurückgeben sollte und den Inhaltsort-Header verwenden sollte, um anzuzeigen, woher das Element tatsächlich kam, z.

HTTP 200 OK 
Content-Location: /my/items/1234  

<item id="1234" serial-number="ABCDEF" /> 

Würde das vernünftig erscheinen? Ich bin mir nicht ganz klar, ob der Standort oder der Content-Standort im zweiten Fall besser geeignet ist.

Antwort

7

Ich hatte vor kurzem ähnliche Anforderungen. Für idempotente Operationen ist PUT der beste Weg. Sie haben recht, da ist eine Diskrepanz zwischen der externen ID und der internen ID. Ich löste es durch eine dedizierte Ressource für die externe ID Ziel zu erstellen:

PUT /api-user/{username}/items/{serialNumber} 

ich es intern lösen als ein CREATE falls ich habe kein Element für ‚username‘ und ‚ABCDEF‘ Seriennummer oder UPDATE falls ich tun .

Wenn es ein CREATE war, gebe ich 201 für ein UPDATE 200 zurück. Außerdem enthält die zurückgegebene Payload sowohl eine selbst erstellte ID als auch die externe Seriennummer, wie Sie in Ihrer Payload vorgeschlagen haben.

+0

Hmmm ja eigentlich mag ich diesen. Obwohl die Seriennummern möglicherweise nicht global eindeutig sind, gibt es eine Wahrscheinlichkeit von nahezu 100%, dass sie innerhalb des Bereichs eines Benutzers eindeutig sind, so dass sie als eindeutige Kennung im Gültigkeitsbereich fungieren kann. Es würde auch mein Problem lösen, wie ein Gerät überprüfen kann, ob es bereits registriert ist, indem es einen GET für diese URL verwendet und überprüft, ob die Antwort eine 200 oder 404 ist. Danke! –

1

Here ist eine interessante Diskussion über die Verwendungen der beiden Header. Es behauptet, dass Content-Location nicht für PUT oder POST definiert ist, daher ist Location in Ihrem Fall möglicherweise die bessere Option. Es ist sicherlich nicht klar, was besser ist.

Insgesamt denke ich, dass Ihre Vorgehensweise sinnvoll ist.

+0

Dieser Artikel fehlt ein wenig, wenn es heißt, Content-Location ist nicht für PUT und POST definiert, die HTTP-Spezifikation sagt eigentlich, dass es nicht für die Anfragen definiert ist, sagt aber nichts über die Antworten. Ich denke, dass es richtig sein könnte, wenn man sagt, dass Content-Location für alternative Formen ist, während Location der tatsächliche Ort ist. Schwierig, sicher von der Spezifikation zu sein: -S –

Verwandte Themen