Quando si tratta di API JSON è buona norma appiattire le risposte ed evitare oggetti JSON annidati?
Ad esempio, diciamo che abbiamo un'API simile a IMDb ma per i videogiochi. Ci sono un paio di entità, Game, Platform, ESRBRating e GamePlatformMap che mappe Games and Platforms.
Diciamo che richiedi / game / 1 che recupera il gioco con ID 1 e restituisce l'oggetto di gioco con le piattaforme e la posizione di esrb annidata.
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
"platforms": [
{"id":1,"name":"Xbox"},
{"id":2,"name":"Playstation"}
],
"esrbRating": {
"id": 1,
"code": "E",
"name": "Everyone"
}
}
Se stai usando qualcosa come JPA / Hibernate, potrebbe farlo automaticamente se è impostato su FETCH.EAGER.
L'altra opzione è semplicemente l'API e aggiungi più punti finali.
In questo caso quando viene richiesto / game / 1 viene restituito solo l'oggetto del gioco.
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
}
Se vuoi le piattaforme e / o ESRBRating dovresti chiamare quanto segue:
/ gioco / 1 / piattaforma / Gioco / 1 / CERS
Questo metodo sembra che potrebbe potenzialmente aggiungere molte altre chiamate al server a seconda dei dati di cui il client ha bisogno e quando ne hanno bisogno.
C'era un ultimo pensiero che avevo in cui avresti restituito qualcosa di simile.
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
"platforms": ["Xbox","Playstation"]
}
Tuttavia, si presume che non abbiano bisogno degli ID o di qualunque altra informazione possa essere associata a quegli oggetti della piattaforma.
Chiedo in generale quale sia il modo migliore per strutturare gli oggetti JSON restituiti dalla tua API. Dovresti provare a stare il più vicino possibile alle tue entità, o è meglio usare Oggetti Dominio o Oggetti di Trasferimento Dati? Capisco che i metodi avranno compromessi, più lavoro sul livello di accesso ai dati o più lavoro per il cliente.
Vorrei anche ascoltare una risposta relativa all'utilizzo di Spring MVC come tecnologia di backend per l'API, con JPA / Hibernate o MyBatis per la persistenza.