Relazioni API RESTful

0

Diciamo che stiamo creando un'API con due risorse: Author e Book dove i libri possono avere molti autori e autori possono avere molti libri.

Quindi progettiamo l'API REST in questo modo:

/books
/books/:id
/books/:id/authors
/authors
/authors/:id
/authors/:id/books

Dovrebbe, ad esempio, /books/:id restituire il Book con il dato id e il diverso Author s? O dovrebbe restituire il Book con il dato id e il id s dei vari Author s che possono quindi essere interrogati tramite una serie di query a /authors/:id o /authors?ids=1,2,3 , ecc.?

    
posta Adam Thompson 15.06.2018 - 23:50
fonte

2 risposte

6

Se, invece degli endpoint di api, si trattava di pagine Web su un sito Web, come sarebbero state organizzate?

Se hai indovinato sbagliato, o peggio ancora dovuto in qualche modo farlo più di un modo, cosa faresti?

Nella maggior parte dei casi, la risposta è: creeresti più documenti e aggiungerai link extra per aiutare le persone a trovare il documento che è più adatto per loro in modo affidabile.

Pensaci: quante pagine web di Hemingway ci sono su Internet?

The web is not your domain, it's a document management system. All the HTTP verbs apply to the document management domain. URIs do NOT map onto domain objects - that violates encapsulation. Work (ex: issuing commands to the domain model) is a side effect of managing resources. In other words, the resources are part of the anti-corruption layer. You should expect to have many many more resources in your integration domain than you do business objects in your business domain. -- Jim Webber 2011

La tua API REST è un tentativo di mascherare il tuo modello di dominio come un sito web. Lascia che il web sia la tua guida.

    
risposta data 16.06.2018 - 00:47
fonte
2

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.

    
risposta data 16.06.2018 - 22:52
fonte

Leggi altre domande sui tag