Quando se trata de APIs JSON, é uma boa prática achatar respostas e evitar objetos JSON aninhados?
Como exemplo, digamos que temos uma API semelhante à IMDb, mas para videogames. Existem algumas entidades, Game, Platform, ESRBRating e GamePlatformMap, que mapeiam Jogos e Plataformas.
Digamos que você solicite / game / 1, que busca o ID do jogo 1 e retorna o objeto do jogo com as plataformas e esrbRating aninhado.
{
"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 você estiver usando algo como JPA / Hibernate, isso poderá ser feito automaticamente se estiver definido como FETCH.EAGER.
A outra opção é simplesmente a API e adicionar mais pontos finais.
Nesse caso, quando / game / 1 for solicitado, apenas o objeto do jogo será retornado.
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
}
Se você quiser as plataformas e / ou ESRBRating, precisará chamar o seguinte:
/ jogo / 1 / plataforma / jogo / 1 / esrb
Parece que esse método pode adicionar várias chamadas ao servidor, dependendo de quais dados o cliente precisa e quando precisa.
Houve um último pensamento que tive onde você teria algo assim retornado.
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
"platforms": ["Xbox","Playstation"]
}
No entanto, isso pressupõe que eles não precisam dos IDs ou de qualquer outra informação que possa estar associada a esses objetos de plataforma.
Pergunto em geral qual é a melhor maneira de estruturar seus objetos JSON retornados da sua API. Você deve tentar ficar o mais próximo possível das suas entidades ou é bom usar objetos de domínio ou objetos de transferência de dados? Entendo que os métodos terão compensações, mais trabalho na camada de acesso a dados ou mais trabalho para o cliente.
Também gostaria de ouvir uma resposta relacionada ao uso do Spring MVC como a tecnologia de back-end da API, com JPA / Hibernate ou MyBatis para persistência.