2013-03-11 13 views
8

Ich habe ein Problem, bei dem ich nicht entscheiden kann, wie ich in dieser Angelegenheit vorgehen soll ... und ich muss wissen, ob es einen Standardweg gibt, um das zu lösen ... oder wenn ihr einen großartigen Beitrag zu dieser Angelegenheit habt.REST API, POST Entity mit Beziehungen?

Die Sache ist, dass ich angefangen habe, eine sehr grundlegende API für Lernzwecke zu bauen Die API ist ein einfacher Musikspeicher .. wo der Laden einige Alben hat, die erfordert und Künstler.

So ist die Beziehung Künstler < --- 1 ----- * ---> Alben und für ein Album zu existieren ist erforderlich, dass das Album einen Künstler hat. Aber der Künstler benötigt nicht und Album.

Nun zum Problem ...

Aufgrund dieser Beziehung, wenn ich .. ein neues Album erstellen möchten würde ich die Albumdaten .. und die gesamte Arist-data..not nur die Post muß ID des Künstlers .. aber der ganze Künstler .. was scheint nicht sehr effektiv, wenn Sie mich fragen .. seit dem eine ganze Menge unnötig. Wie ich es sehe gibt es zwei Wege das zu lösen ... entweder poste ich einfach das gesamte Album-Daten/Objekt und erlaube den Artist-Daten für das Objekt nur eine ID zu enthalten die dann auf die verweist Künstler.

Also statt der Entsendung:

{ 
"Name":"AlbumName", 
"Description":"Some description for the album", 
"ReleaseYear": "1992", 
"Artist" { 
    "Name":"Some artist", 
    "Id":"12345", 
    "Biography":"Lorem ipsum dolor sit amet" 
    } 
} 

Ich würde dies tun:

{ 
    "Name":"AlbumName", 
    "Description":"Some description for the album", 
    "ReleaseYear": "1992", 
    "Artist" { 
     "Id":"12345" 
     } 
    } 

Option Nummer zwei ist tatsächlich ein Weg/url das ist spezifisch für diese ... zum Beispiel: /api/artist/{artistid}/album Und dann post einfach ein Album-Objekt auf diese URL ..

Aber wie gesagt .. Im r Eally nicht sicher, was richtig oder falsch hier ist .. oder gibt es einen Standard-Weg, dies zu behandeln?

Vielen Dank im Voraus!

Antwort

6

Ich würde so etwas vorschlagen.

POST /musicstore/artist/343/albums 

{ 
    "Name":"AlbumName", 
    "Description":"Some description for the album", 
    "ReleaseYear": "1992", 
} 

Der Akt der 343 schafft zwischen dem Künstler und dem Album, die Beziehung implizit eine Ressource als Kind der Sammlung von Alben für den Künstler zu schaffen. Es muss nicht in der Payload angegeben werden.

+0

Könnte hier nicht-topic sein .. aber wie würden Sie dies in der ASP.net Web-API tun .. seit der Definition einer neuen Route für jede solche Route würde eine riesige Menge von Code-Linien erstellen .. – Inx

+0

Was über eine Viele-zu-viele-Ressource? Sollte der Pfad die zwei eindeutigen IDs enthalten oder sollte eine der beiden in einer Körper-Nutzlast sein? – Stephane

+0

@StephaneEybert Entweder würde funktionieren. Ich bevorzuge Letzteres. Abhängig von Ihrer Umgebung könnte diese http://tools.ietf.org/id/draft-snell-link-method-01.html ebenfalls interessant sein. –

0

Ich denke, dass beide Optionen richtig sind und es liegt an Ihnen, welche zu verwenden. Der zweite ist mehr wie HATEOAS.