Khi nói đến API JSON, cách tốt nhất là làm phẳng các phản hồi và tránh các đối tượng JSON lồng nhau?
Như một ví dụ cho phép chúng ta có một API tương tự IMDb nhưng dành cho các trò chơi video. Có một vài thực thể, Trò chơi, Nền tảng, ESRBRating và GamePl PlatformMap để ánh xạ Trò chơi và Nền tảng.
Hãy nói rằng bạn yêu cầu / trò chơi / 1 tìm nạp trò chơi bằng ID 1 và nó trả về đối tượng trò chơi với các nền tảng và esrbRating lồng nhau.
{
"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"
}
}
Nếu bạn đang sử dụng một cái gì đó như JPA / Hibernate, nó có thể tự động làm điều này cho bạn nếu nó được đặt thành FETCH.EAGER.
Tùy chọn khác là chỉ đơn giản là API và thêm nhiều điểm kết thúc.
Trong trường hợp đó khi / game / 1 được yêu cầu, đối tượng trò chơi được trả về.
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
}
Nếu bạn muốn các nền tảng và / hoặc ESRBRating, bạn sẽ phải gọi như sau:
/ trò chơi / 1 / nền tảng / trò chơi / 1 / esrb
Phương pháp này có vẻ như có khả năng có thể thêm nhiều cuộc gọi đến máy chủ tùy thuộc vào dữ liệu nào khách hàng cần và khi nào họ cần.
Có một suy nghĩ cuối cùng tôi đã có nơi bạn sẽ có một cái gì đó như thế này trở lại.
{
"id": 1,
"title": "Game A",
"publisher": "Publisher ABC",
"developer": "Developer DEF",
"releaseDate": "2015-01-01",
"platforms": ["Xbox","Playstation"]
}
Tuy nhiên, điều này giả định rằng họ không cần ID hoặc bất kỳ thông tin nào khác có thể được liên kết với các đối tượng nền tảng đó.
Nói chung, tôi hỏi cách tốt nhất để cấu trúc các đối tượng JSON được trả về từ API của bạn là gì. Bạn có nên cố gắng ở gần các thực thể của mình nhất có thể không, hoặc sử dụng Đối tượng miền hoặc Đối tượng truyền dữ liệu có ổn không? Tôi hiểu các phương thức sẽ có sự đánh đổi, hoặc nhiều công việc hơn trên lớp truy cập dữ liệu hoặc nhiều công việc hơn cho khách hàng.
Tôi cũng muốn nghe câu trả lời liên quan đến việc sử dụng Spring MVC làm công nghệ phụ trợ cho API, với JPA / Hibernate hoặc MyBatis để duy trì.