弹簧架控制器返回特定字段
我一直在思考使用Spring MVC设计JSON API的最佳方法。众所周知,IO很昂贵,因此我不想让客户端进行几次API调用来获得他们需要的东西。然而,与此同时,我不一定想归还厨房水槽。
举个例子,我正在开发一个类似于IMDB的游戏API,但用于视频游戏。
如果我返回与游戏连接的所有内容,它将看起来像这样。
/api/game/1
{
"id": 1,
"title": "Call of Duty Advanced Warfare",
"release_date": "2014-11-24",
"publishers": [
{
"id": 1,
"name": "Activision"
}
],
"developers": [
{
"id": 1,
"name": "Sledge Hammer"
}
],
"platforms": [
{
"id": 1,
"name": "Xbox One",
"manufactorer": "Microsoft",
"release_date": "2013-11-11"
},
{
"id": 2,
"name": "Playstation 4",
"manufactorer": "Sony",
"release_date": "2013-11-18"
},
{
"id": 3,
"name": "Xbox 360",
"manufactorer": "Microsoft",
"release_date": "2005-11-12"
}
],
"esrbRating": {
"id": 1,
"code": "T",
"name": "Teen",
"description": "Content is generally suitable for ages 13 and up. May contain violence, suggestive themes, crude humor, minimal blood, simulated gambling and/or infrequent use of strong language."
},
"reviews": [
{
"id": 1,
"user_id": 111,
"rating": 4.5,
"description": "This game is awesome"
}
]
}
但是,他们可能不需要所有这些信息,但话又说回来,他们可能。从 I/O 和性能的角度来看,调用所有内容似乎是一个坏主意。
我想通过在请求中指定包含参数来做到这一点。
现在,例如,如果您没有指定任何包含,您将获得的只是以下内容。
{
"id": 1,
"title": "Call of Duty Advanced Warfare",
"release_date": "2014-11-24"
}
但是,您想要的所有信息,您的请求将如下所示。
/api/game/1?include=publishers,developers,platforms,reviews,esrbRating
这样,客户端就可以指定他们想要的信息量。但是,我有点不知所措,使用Spring MVC实现此目的的最佳方法。
我认为控制器看起来像这样。
public @ResponseBody Game getGame(@PathVariable("id") long id,
@RequestParam(value = "include", required = false) String include)) {
// check which include params are present
// then someone do the filtering?
}
我不确定如何选择性地序列化 Game 对象。这甚至有可能吗?在春季MVC中解决这个问题的最佳方法是什么?
仅供参考,我正在使用Spring Boot,其中包括Jackson进行序列化。