Sono in procinto di creare un'API REST e al momento sto riscontrando il seguente problema:
-
Foo
è la prima risorsa. Le operazioni CRUD possono essere applicate tramite l'URI/foo/
. -
Bar
è la seconda risorsa. Le operazioni CRUD possono essere applicate tramite l'URI/bar/
. - Ogni
Foo
è associato a zero o aBar
. Il motivo per cui non consideroBar
come una subresource diFoo
è perché la stessa% di istanza diBar
può essere condivisa tra il mutipleFoo
s. Quindi ho capito che è meglio accedervi tramite un URI indipendente anziché/foo/[id]/bar
.
Il mio problema è che in una quantità significativa di casi, i clienti che richiedono un'istanza Foo
sono interessati anche all'istanza Bar
associata. Attualmente, ciò significa che devono eseguire due query invece di 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 ho inventato finora:
- Potrei introdurre un parametro di query simile a questo:
/foo/[id]?include_bar=true
. Il problema con questo approccio è che la rappresentazione della risorsa (ad esempio la struttura JSON) della risposta dovrebbe apparire diversa (ad esempio un contenitore come{ foo: ..., bar: ... }
invece di un soloFoo
serializzato), che rende la risorsaFoo
endpoint "eterogeneo". Non penso sia una buona cosa. Quando si esegue una query su/foo
, i client devono sempre ottenere la stessa rappresentazione di risorse (struttura), indipendentemente dai parametri di query. - Un'altra idea è di introdurre un nuovo endpoint di sola lettura, ad es. %codice%. In questo caso, non è un problema restituire una rappresentazione come
/fooandbar/[foo-id]
, perché allora è solo la rappresentazione "ufficiale" della risorsa{ foo: ..., bar: ... }
. Tuttavia, non so se un tale endpoint helper sia realmente RESTful (questo è il motivo per cui ho scritto "can" nel titolo della domanda. Naturalmente è tecnicamente possibile, ma non so se sia una buona idea).
Che ne pensi? Ci sono altre possibilità?