Supposto che disponga di due risorse di livello superiore Foo
e Bar
. Ora è necessario collegare lo Foo
ad alcuni degli Bar
. In una classe Java che questo potrebbe essere simile a questa:Progettazione API REST: collegamento risorse
public class Foo {
Set<Bar> bars;
}
public class Bar { … }
mi piacerebbe modellare la rappresentazione XML Foo
a qualcosa di simile:
GET /foos/1
<foo>
…
<atom:link rel="self" href="/foos/1" />
<atom:link rel="bars" href="/foos/1/bars" />
</foo>
Così ho esporre praticamente tutto Bar
assegnato a Foo
come risorsa nidificata. Ciò significa che la risorsa Bar
ha un ciclo di vita individuale (aggregazione anziché composizione). La risorsa nidificato potrebbe quindi esporre tutte legate Bar
qualcosa di simile:
GET /foos/1/bars
<bars>
<atom:link rel="bar" href="/foos/1/bars/1" />
<atom:link rel="bar" href="/foos/1/bars/2" />
</bars>
Alteratively ho potuto inline la collezione nel <foo>
elemento in anticipo. Tuttavia, sono ancora bloccato con alcune domande: mentre ciò mi consente di rimuovere con precisione un da attivando una richiesta DELETE
ad es. /foos/1/bars/1
ma come si assegnerebbe uno Bar
a un Foo
quindi? Supponendo che il cliente avrebbe accedere /bars
ottenere:
GET /bars
<bars>
<bar>
…
<atom:link rel="self" href="/bars/4711" />
</bar>
</bars>
e decidere che vuole assegnare /bars/1
-/foo/1/bars
. Stavo pensando a una richiesta POST
su /foo/1/bars
ma non ero sicuro su cosa inviare effettivamente. Un elemento link
che punta alla risorsa Bar
come la seguente?
POST /foos/1/bars
<atom:link href="/bars/4711" />
Questo sembra abbastanza bene come i clienti avrebbero ancora bisogno di creare URL e ci continua a soddisfare i vincoli di riposo. Tuttavia sembra un po 'strano ai collegamenti POST
al server. C'è una soluzione migliore per questo scenario?
Non avrei alcuna esitazione nel POST di un collegamento per stabilire una relazione tra due risorse. Alcune persone credono che tu debba recuperare la risorsa e poi POST che sia auto-descrittiva, ma non sono convinto che sia necessario. –
Questo è quello che sento anche perché tu sei un) creare inutili chiacchiere eb) non è necessario che l'intera versione sul lato server crei effettivamente il collegamento. –