Sono in corso la creazione di un'API REST e attualmente sto riscontrando il seguente problema:
Foo
è la prima risorsa. Le operazioni CRUD possono essere applicate tramite l'/foo/
URI.Bar
è la seconda risorsa. Le operazioni CRUD possono essere applicate tramite l'/bar/
URI.- Ogni
Foo
è associato a zero o unoBar
. Il motivo per cui non consideroBar
una risorsa secondaria diFoo
è perché la stessaBar
istanza può essere condivisa tra più utentiFoo
. Quindi ho pensato che fosse meglio accedervi tramite un URI indipendente anziché/foo/[id]/bar
.
Il mio problema è che in molti casi i clienti che chiedono Foo
un'istanza sono interessati anche Bar
all'istanza associata . Attualmente, ciò significa che devono eseguire due query anziché una. Voglio introdurre un modo che consenta di ottenere entrambi gli oggetti con una singola query, ma non so come modellare l'API per farlo. Quello che mi è venuto in mente finora:
- Potrei introdurre un parametro di query simile a questo:
/foo/[id]?include_bar=true
. Il problema con questo approccio è che la rappresentazione delle risorse (ad es. La struttura JSON) della risposta dovrebbe apparire diversa (ad es. Un contenitore come{ foo: ..., bar: ... }
invece di un semplice serializzatoFoo
), il che rende l'Foo
endpoint della risorsa "eterogeneo". Non penso sia una buona cosa. Durante la query/foo
, i client devono sempre ottenere la stessa rappresentazione (struttura) delle risorse, indipendentemente dai parametri della query. - Un'altra idea è quella di introdurre un nuovo endpoint di sola lettura, ad es
/fooandbar/[foo-id]
. In questo caso, non è un problema restituire una rappresentazione come{ foo: ..., bar: ... }
, perché è solo la rappresentazione "ufficiale" dellafooandbar
risorsa. Tuttavia, non so se un tale endpoint di supporto sia davvero RESTful (questo è il motivo per cui ho scritto "can" nel titolo della domanda. Naturalmente è tecnicamente possibile, ma non so se sia una buona idea).
Cosa ne pensi? Ci sono altre possibilità?
Bar
non può esistere senza essere associato a Foo
. Tuttavia, come ho scritto sopra, è possibile che più Foo
s condividano lo stesso Bar
. Dovrebbe essere possibile creare un Foo
senza un Bar
associato, quindi non credo che Bar
dovrebbe essere trattato come genitore.