我正在构建一个RESTful API,并希望为开发者提供选择返回JSON响应中的哪些字段的选项。 这篇博客文章展示了多个API(如Google,Facebook,LinkedIn)如何允许开发者自定义响应内容,这被称为部分响应。
一个示例可能如下所示:
在上面的示例中,API 应该返回用户 "123" 的 userId、fullName 和 title 字段。
我正在寻找如何在我的 RESTful web 服务中实现这一点的想法。我目前正在使用 CXF(编辑:和 Jackson),但愿意尝试另一个 JAX-RS 实现。
以下是我目前拥有的内容。它返回完整的 User 对象。如何根据运行时的“fields”参数仅返回 API 调用者想要的字段?我不想使其他字段为空。我只是不想返回它们。
一个示例可能如下所示:
/users/123?fields=userId,fullname,title
在上面的示例中,API 应该返回用户 "123" 的 userId、fullName 和 title 字段。
我正在寻找如何在我的 RESTful web 服务中实现这一点的想法。我目前正在使用 CXF(编辑:和 Jackson),但愿意尝试另一个 JAX-RS 实现。
以下是我目前拥有的内容。它返回完整的 User 对象。如何根据运行时的“fields”参数仅返回 API 调用者想要的字段?我不想使其他字段为空。我只是不想返回它们。
@GET
@Path("/{userId}")
@Produces("application/json")
public User getUser(@PathParam("userId") Long userId,
@DefaultValue("userId,fullname,title") @QueryParam("fields") String fields) {
User user = userService.findOne(userId);
StringTokenizer st = new StringTokenizer(fields, ",");
while (st.hasMoreTokens()) {
// here's where i would like to select only the fields i want to return
}
return user;
}
更新:
我按照unludo的链接,然后链接到了这个网址:http://wiki.fasterxml.com/JacksonFeatureJsonFilter
有了这些信息,我在我的域类中添加了@JsonFilter("myFilter")
。然后,我修改了我的RESTful服务方法,将返回类型从User改为String,如下所示:
@GET
@Path("/{userId}")
@Produces("application/json")
public String getUser(@PathParam("userId") Long userId,
@DefaultValue("userId,fullname,title") @QueryParam("fields") String fields) {
User user = userService.findOne(userId);
StringTokenizer st = new StringTokenizer(fields, ",");
Set<String> filterProperties = new HashSet<String>();
while (st.hasMoreTokens()) {
filterProperties.add(st.nextToken());
}
ObjectMapper mapper = new ObjectMapper();
FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter",
SimpleBeanPropertyFilter.filterOutAllExcept(filterProperties));
try {
String json = mapper.filteredWriter(filters).writeValueAsString(user);
return json;
} catch (IOException e) {
e.printStackTrace();
return e.getMessage();
}
}
我需要进行更多的测试,但目前为止还不错。