我正在构建一个 RESTful API,并希望为开发人员提供选择在 JSON 响应中返回哪些字段的选项。这篇博文 http://blog.apigee.com/detail/restful_api_design_can_your_api_give_developers_just_the_information/显示了多个 API(Google、Facebook、LinkedIn)如何允许开发人员自定义响应的示例。这称为部分响应。
一个例子可能如下所示:
/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;
}
UPDATE:
我点击了 unludo 的链接,然后链接到此:http://wiki.fasterxml.com/JacksonFeatureJsonFilter http://wiki.fasterxml.com/JacksonFeatureJsonFilter
我添加了这些信息@JsonFilter("myFilter")
到我的域类。然后我修改了 RESTful 服务方法以返回 String 而不是 User,如下所示:
@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();
}
}
我需要做更多测试,但到目前为止一切顺利。