Когда дело доходит до API JSON, рекомендуется ли выравнивать ответы и избегать вложенных объектов JSON?
В качестве примера, скажем, у нас есть API, похожий на IMDb, но для видеоигр. Существует пара сущностей: Game, Platform, ESRBRating и GamePlatformMap, которые отображают игры и платформы.
Допустим, вы запрашиваете / game / 1, который выбирает игру с идентификатором 1 и возвращает игровой объект с платформами и вложенным esrbRating.
{
"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"
}
}
Если вы используете что-то вроде JPA / Hibernate, он может автоматически сделать это за вас, если для него установлено значение FETCH.EAGER.
Другой вариант - просто API и добавить больше конечных точек.
В том случае, когда запрашивается / game / 1, возвращается только игровой объект.
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
}
Если вам нужны платформы и / или ESRBRating, вам нужно вызвать следующее:
/ игра / 1 / платформа / игра / 1 / esrb
Похоже, что этот метод потенциально может добавить еще несколько вызовов на сервер в зависимости от того, какие данные нужны клиенту и когда они ему нужны.
У меня была одна последняя мысль, когда ты должен был вернуть что-то подобное.
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
"platforms": ["Xbox","Playstation"]
}
Однако это предполагает, что им не нужны идентификаторы или любая другая информация, которая может быть связана с этими объектами платформы.
Я вообще спросил, как лучше структурировать ваши объекты JSON, возвращаемые из вашего API. Стоит ли вам стараться держаться как можно ближе к своим сущностям, или это нормально - использовать объекты домена или объекты передачи данных? Я понимаю, что методы будут иметь компромисс, либо больше работы на уровне доступа к данным, либо больше работы для клиента.
Я также хотел бы услышать ответ, касающийся использования Spring MVC в качестве базовой технологии для API, с JPA / Hibernate или MyBatis для сохранения.