JSON APIに関しては、応答をフラット化し、ネストされたJSONオブジェクトを避けるのが良いでしょうか?
例として、IMDbに似ているがビデオゲーム用のAPIがあるとします。いくつかのエンティティ、Game、Platform、ESRBRating、GamesとPlatformsをマップするGamePlatformMapがあります。
ID 1のゲームを取得する/ game / 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に設定されていれば自動的にこれを行うことがあります。
もう1つのオプションは、単にAPIを追加して、エンドポイントを追加することです。
その場合、/ game / 1が要求されると、ゲームオブジェクトのみが返されます。
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
}
プラットフォームやESRBRatingが必要な場合は、次を呼び出す必要があります。
/ game / 1 / platform / game / 1 / esrb
このメソッドは、クライアントが必要とするデータと必要なタイミングに応じて、サーバーにさらにいくつかの呼び出しを追加する可能性があるようです。
最後に、このようなものが返されると思いました。
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
"platforms": ["Xbox","Playstation"]
}
ただし、これは、IDやその他の情報がプラットフォームオブジェクトに関連付けられている必要がないことを前提としています。
一般に、APIから返されたJSONオブジェクトを構造化する最良の方法は何かを尋ねます。エンティティにできるだけ近づけるようにする必要がありますか、またはドメインオブジェクトまたはデータ転送オブジェクトを使用しても問題ありませんか?メソッドには、データアクセス層でのより多くの作業またはクライアントでのより多くの作業のいずれかのトレードオフがあることを理解しています。
また、APIのバックエンドテクノロジーとしてSpring MVCを使用し、永続化のためにJPA / HibernateまたはMyBatisのいずれかを使用することに関連した回答も聞きたいです。