我构建了一个RESTful API,并希望为开发人员提供选项,以便选择在JSON响应中返回哪些字段。 This blog post显示了几个API(Google,Facebook,LinkedIn)允许开发人员定制响应的示例。这被称为部分响应。如何使用Java返回部分JSON响应?
一个例子可能是这样的:
/users/123?fields=userId,fullname,title
在API上面的例子应该返回用户id,用户“123”全名和标题字段。
我正在寻找如何在我的REST风格的Web服务中实现这个想法。我目前正在使用CXF(编辑:和杰克逊),但愿意尝试另一个JAX-RS实现。
这是我目前有。它返回一个完整的用户对象。我怎样才能返回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
有了这些信息,我添加@JsonFilter("myFilter")
我的领域类。然后我修改了RESTful服务方法返回一个字符串,而不是用户如下:
@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();
}
}
我需要做更多的测试,但到目前为止,一切顺利。
如果我想让字段查询参数选项不区分大小写? – 2017-01-03 14:31:02