我構建了一個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