Jeśli chodzi o interfejsy API JSON, czy dobrą praktyką jest spłaszczanie odpowiedzi i unikanie zagnieżdżonych obiektów JSON?
Jako przykład powiedzmy, że mamy interfejs API podobny do IMDb, ale do gier wideo. Istnieje kilka encji: Gra, Platforma, ESRBRating i GamePlatformMap, która mapuje Gry i platformy.
Powiedzmy, że żądasz / game / 1, która pobiera grę o identyfikatorze 1 i zwraca obiekt gry z zagnieżdżonymi platformami i 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"
}
}
Jeśli używasz czegoś takiego jak JPA / Hibernate, może to zrobić automatycznie, jeśli jest ustawiony na FETCH.EAGER.
Inną opcją jest po prostu interfejs API i dodanie kolejnych punktów końcowych.
W takim przypadku, gdy wymagane jest / game / 1, zwracany jest tylko obiekt gry.
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
}
Jeśli chcesz platformy i / lub ESRBRating, musisz zadzwonić pod następujący numer:
/ game / 1 / platform / game / 1 / esrb
Wydaje się, że ta metoda może potencjalnie dodać kilka kolejnych wywołań do serwera, w zależności od danych potrzebnych klientowi i kiedy go potrzebuje.
Była jedna ostatnia myśl, w której chciałbym, żebyś wrócił coś takiego.
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
"platforms": ["Xbox","Playstation"]
}
Zakłada się jednak, że nie potrzebują one identyfikatorów ani żadnych innych informacji powiązanych z tymi obiektami platformy.
Pytam ogólnie, jaki jest najlepszy sposób na uporządkowanie obiektów JSON zwróconych z interfejsu API. Czy powinieneś starać się być jak najbliżej swoich bytów, czy też dobrze jest używać Obiektów Domeny lub Obiektów Transferu Danych? Rozumiem, że metody będą miały kompromisy, albo więcej pracy na warstwie dostępu do danych, albo więcej pracy dla klienta.
Chciałbym również usłyszeć odpowiedź związaną z używaniem Spring MVC jako technologii zaplecza dla API, z JPA / Hibernate lub MyBatis dla trwałości.