Erstellen einer Entitätsbeziehung in REST: Darf ich das übergeordnete Element erstellen, indem ich es auf eine untergeordnete ID poste?

9

Derzeit entwickeln wir eine REST-API für den Zugriff auf klassische Kundendaten. Eines der Elemente in der API sind die Assets eines Benutzers. Die Assets werden unter einem bestimmten Service hinzugefügt. Die Backend-API fügt einem Benutzer unter einem bestimmten Dienst nur ein Asset hinzu. Es gibt also keine Benutzer - Asset-Beziehung, sondern eine Benutzer - [Service] - Asset-Beziehung.

Unsere URIs sehen folgendermaßen aus:

/users/{id}/assets/{id}/services/{id}

Die Verwendung der API kennt die Asset-ID und die Service-ID, um einen neuen Eintrag zu erstellen. Wir haben mit der Schaffung dieser Beziehung zu kämpfen.

Ein einfacher Weg wäre, die gesamte Beziehung zu zu posten /users/{id}/assets/

POST /users/{id}/assets    
{asset:${id}, service:{id}, attribute1:"{var}", attribute2:"{var}"}

Dann erstellen wir jedoch kein Asset, wie der URI möglicherweise anzeigt, sondern eine Asset-Service-Beziehung.

Als Alternative erwägen wir, POST an die URI zu senden, um die Beziehung wie folgt zu behandeln:

POST /users/{id}/assets/{id}/service/{id}
{attribute1:"{var}", attribute2:"{var}"}

In diesem Fall ist der Ressourcenpfad /users/{id}/assets/{id}jedoch nicht vor dem POST vorhanden und wird als Nebeneffekt erstellt.

Ist POST auf einen Ressourcenpfad, der noch nicht vorhanden ist, überhaupt zulässig?

Danke für deine Gedanken,

Gerard.

maasg
quelle

Antworten:

3

Es hört sich so an, als würden Sie vorschlagen, dass ein Benutzer, wenn er zum ersten Mal in einer nicht vorhandenen Beziehung Beiträge verfasst, diese als Teil des Beitrags erstellt.

Wenn Sie sich fragen, ob diese Art von Muster zum Erstellen beim Zugriff ein gültiges, akzeptables Entwicklungsmuster ist, lautet die Antwort "Ja" - es ist sowohl gültig als auch ein ziemlich häufiges Muster.

Blaubeerfelder
quelle
1
Danke für die Antwort. Gibt es Hinweise auf eine Referenz, die ich konsultieren könnte?
Maasg
2

Hier gibt es mehrere Punkte: Erstens: Sie sollten die ID nicht eingeben, wenn Sie eine neue Ressource erstellen, da diese ID möglicherweise bereits vorhanden ist, oder das System verwendet eine bestimmte Technik, um die ID zu generieren, und Sie zwingen sie, Ihre zu verwenden, und für die Schlagen Sie vor, dass die ID vom System erstellt werden muss. Das Attribut für den Standortheader muss im Falle einer Erstellungsressource festgelegt werden, um die Rückmeldung mit der generierten ID zu erhalten.

Zweitens: Ihr JSON ist nicht korrekt. Sie müssen den Dienst als ein anderes Objekt innerhalb des Asset-Objekts behandeln, ebenso wie Sie ihn in den Ressourcen-URI-Diensten als Array behandeln müssen.

POST /users/{id}/assets    
{asset:${id}, service:{id}, attribute1:"{var}", attribute2:"{var}"}

muß sein:

POST /users/{id}/assets    
{services:[{ attribute1:"var", attribute2:"var"}]}

Wenn Sie diesen Weg benutzen wollen

Drittens: Ich bevorzuge es nicht, diese Methode für Entwurfsvorschläge zu verwenden. Wenn dieser Fall fehlgeschlagen ist, wie können Sie dann wissen, dass er beim Erstellen eines Assets oder einer Dienstleistung fehlgeschlagen ist?

Bassem Reda Zohdy
quelle
0

Hier ist ein anderer Gedankengang:

POST /relationships
{ relationship:${id}, asset:{id}, service:{id}, user:{id}, data:"some data" }

Auf diese Weise definieren Sie die Beziehungen als eine Drei-Wege-Verbindung zwischen Asset, Service und Benutzer und implizieren keine hierarchische Beziehung

Sie können dann eine bestimmte Beziehung abrufen, indem Sie:

GET /relationships?id="2144321"

oder suchen Sie nach einer Teilmenge von Beziehungen nach:

GET /relationships?user="43434"

oder

GET /relationships?asset="12433"

Der ursprüngliche Weg ist nicht falsch, aber dieser Ansatz gibt Ihnen möglicherweise mehr Flexibilität darüber, wer verwendet wird.

Michael Shaw
quelle