En ce qui concerne les API JSON, est-il recommandé d’aplanir les réponses et d’éviter les objets JSON imbriqués?
Par exemple, disons que nous avons une API similaire à IMDb mais pour les jeux vidéo. Il existe plusieurs entités, Game, Platform, ESRBRating et GamePlatformMap, qui mappent les jeux et les plates-formes.
Disons que vous demandez / jeu / 1 qui va chercher le jeu avec l'ID 1 et qu'il retournera l'objet du jeu avec les plateformes et esrbRating imbriquées.
{
"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"
}
}
Si vous utilisez quelque chose comme JPA / Hibernate, il peut le faire automatiquement s'il est défini sur FETCH.EAGER.
L'autre option consiste à simplement utiliser l'API et à ajouter davantage de points d'extrémité.
Dans ce cas, lorsque / game / 1 est demandé, seul l'objet game est renvoyé.
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
}
Si vous souhaitez les plates-formes et / ou ESRBRating, vous devez appeler le numéro suivant:
/ jeu / 1 / plateforme / jeu / 1 / esrb
Cette méthode semble potentiellement ajouter plusieurs appels supplémentaires au serveur, en fonction des données dont le client a besoin et du moment où il en a besoin.
Il y avait une dernière pensée que j'avais où vous auriez quelque chose comme ceci retourné.
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
"platforms": ["Xbox","Playstation"]
}
Toutefois, cela suppose qu'ils n'ont pas besoin des ID ou de toute autre information pouvant être associée à ces objets de plate-forme.
Je demande en général quel est le meilleur moyen de structurer vos objets JSON renvoyés par votre API. Devriez-vous essayer de rester aussi proche que possible de vos entités, ou est-il préférable d'utiliser des objets de domaine ou des objets de transfert de données? Je comprends que les méthodes auront des compromis, soit plus de travail sur la couche d'accès aux données, soit plus de travail pour le client.
J'aimerais également entendre une réponse relative à l'utilisation de Spring MVC en tant que technologie de base pour l'API, avec JPA / Hibernate ou MyBatis pour la persistance.