Should, for example, /books/:id return the Book with the given id and
the various Authors? Or should it return the Book with the given id
and the ids of the various Authors which can then be queried either
via a bunch of queries to /authors/:id or /authors?ids=1,2,3, etc.?
Breve storia lunga. dipende .
La rappresentazione della risorsa identificata da /books/x
dipende da come desideri che i clienti consumino, interagiscano e scoprano i libri e le risorse correlate. Se un Book
dovrebbe fornire ai clienti i dati degli autori o / e id, dipende principalmente da queste cose.
Se stavi sviluppando un'API REST per più client, dovresti decidere come vuoi che consumino la tua API e quante richieste vuoi che facciano per loro tutti i dati . Tra le altre cose.
Sarebbe diverso se l'API si occupasse solo di un singolo cliente. Diciamo un'app mobile o un'app Web. In questi casi, queste app si comportano come un faro. I loro bisogni servono a dettare quali rappresentazioni rispondono meglio alle loro esigenze di UX, usabilità, efficienza, ecc.
Potrebbero esserci altre preoccupazioni da considerare. Ad esempio, se c'è qualche problema di sicurezza da prendere in considerazione prima che i clienti passino da libri ad autori . I clienti hanno bisogno di concessioni speciali per recuperare tutti i dettagli dell'autore? O vice-versa , ecc.
@VoinceOfUnreason ha già fatto un buon punto
Your REST API is an attempt to disguise your domain model as a web
site. Let the web be your guide.
Questo è più facile da concettualizzare con HATEOAS
{
"title":"The Jungle Book",
"published":1894
"_link":{
"self":{ "href": "http://myserver/book/x"},
"authors":{ "href": "http://myserver/book/x/authors"}
},
"_embedded":{
"authors":[
{
"name": "Rudyard Kipling",
"_links:":{
"self":{ "href": "http://myserver/author/y"},
"books":{ "href": "http://myserver/author/y/books"}
}
}
}
}
La precedente rappresentazione di /book/x
sarebbe il contenuto della pagina /book/x.page
. Tutto ciò che ho ritenuto necessario ai clienti per mostrare il libro come voglio che sia, è lì. Ciò che non lo è, può essere recuperato seguendo _links
o embedded resource links
. In altre parole. In pagine / risorse correlate.
Naturalmente, avrei potuto restituire tutto in un'unica richiesta. Tuttavia, avrei dovuto pesare prima le conseguenze. Ad esempio, cosa succede quando ho una raccolta di Books
invece di una singola. Come si comporterebbe il server con tale necessità di carico per libro, pagina, ecc. In concorrenza. E come si comporterebbe il server di database in queste condizioni?
Come vedi, ci sono molte cose che potrebbero influenzare la decisione. Ecco perché è difficile per noi dire cosa dovresti fare. Tutto dipende dai tuoi bisogni e requisiti concreti. E anche i vincoli.