12 Stimmen

HTTP POST-Anfragen in einer RESTful HATEOAS-API

Ich schreibe eine RESTful HATEOAS API. Ich habe zusammengesetzte Entitäten, die ich abrufen (GET), erstellen (POST) und aktualisieren (PUT) muss. Der GET-Teil ist einfach und hat viele Beispiele. Die Antwort enthält die primitiven Attribute der Entität und Links zu verschachtelten Entitäten. Zum Beispiel:

{
 "id":"2",
 "firstName":"Brad",
 "lastName":"Pitt",
 "balance":1234.5,
 "transactions":"http://localhost:8080/jersey-poc/api/v1.1/account/1/transactions",
 "self":"http://localhost:8080/api/v1.1/account/1",
 "accountType":"http://localhost:8080/api/v1.1/account/1/accountType"
}

Das Problem entsteht, wenn ich das Konto erstellen oder ändern möchte. Ich muss das Konto mit einem accountType verknüpfen. Ich kann eine POST-Anfrage senden, wie zum Beispiel: {"firstName":"Michael","lastName":"Jackson","balance":300.0,"accountTypeId":5}
aber das würde das HATEOAS-Paradigma brechen. Was ist die beste Praxis zum Erstellen/Aktualisieren von zusammengesetzten Entitäten?

4voto

Donal Fellows Punkte 125686

Es gibt nichts Besonderes an diesem Payload, das gegen HATEOAS sprechen würde; das einzige echte Problem ist, dass die accountTypeId nicht sehr entdeckbar ist. (Magische IDs sind immer besser, wenn sie in kurze beschreibende Strings abgebildet werden; denken Sie an sie als eine Art Aufzählung.) Eines der wichtigsten Dinge, die man bei der Arbeit an einem HATEOAS-Modell beachten sollte, ist, dass die Entität, die der Benutzer POSTet, nicht genau die Entität sein muss, die die Ressource erstellt; man kann sie modifizieren, annotieren, übersetzen. Es sollte immer noch konzeptionell das Gleiche sein, das ist aber völlig anders als identisch. (Das Hinzufügen von IDs und Erstellungszeitstempeln wären ausgezeichnete Beispiele dafür, wie die Erweiterung völlig vernünftig wäre.)

Für mich hört es sich so an, als ob Ihr eigentliches Problem darin besteht, darauf zurückzukommen, welche Informationen die Clients einreichen sollen, wenn sie einen POST durchführen, und wie Sie den Clients mitteilen möchten, dass sie diese Informationen einreichen sollen, wenn sie den POST durchführen. Ich persönlich verwende gerne XML für den Upload hier, weil ich den Clients leicht mitteilen kann, dass ihre POST-Payloads einem bestimmten Schema entsprechen sollten (und sowohl XML Schema als auch RELAX NG sind für mich reich genug, um die Einschränkungen zu beschreiben). Ich bin sicher, dass das nicht der einzige Weg ist, es zu tun.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X