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 consideroBaruna risorsa secondaria diFooè perché la stessaBaristanza 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 Fooun'istanza sono interessati anche Barall'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'Fooendpoint 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" dellafooandbarrisorsa. 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à?
Barnon può esistere senza essere associato a Foo. Tuttavia, come ho scritto sopra, è possibile che più Foos condividano lo stesso Bar. Dovrebbe essere possibile creare un Foosenza un Barassociato, quindi non credo che Bardovrebbe essere trattato come genitore.