मैं एक विश्वसनीय API बना रहा हूं और जेएसओएन प्रतिक्रिया में कौन से फ़ील्ड लौटने के लिए चुनने के विकल्प के साथ डेवलपर्स प्रदान करना चाहता हूं। This blog post उदाहरण दिखाता है कि कितने एपीआई (Google, फेसबुक, लिंक्डइन) डेवलपर्स को प्रतिक्रिया को अनुकूलित करने की अनुमति देते हैं। इसे आंशिक प्रतिक्रिया के रूप में जाना जाता है।जावा का उपयोग कर आंशिक JSON प्रतिक्रिया कैसे वापस करें?
एक उदाहरण इस प्रकार दिखाई देंगे:
/users/123?fields=userId,fullname,title
एपीआई ऊपर के उदाहरण में userId, उपयोगकर्ता "123" के लिए पूरा नाम और शीर्षक क्षेत्रों लौटना चाहिए।
मैं अपने रीस्टफुल वेब सेवा में इसे कार्यान्वित करने के विचारों की तलाश में हूं। मैं वर्तमान में सीएक्सएफ (संपादित करें: और जैक्सन) का उपयोग कर रहा हूं लेकिन एक और जेएक्स-आरएस कार्यान्वयन करने की कोशिश करता हूं।
यहां मेरे पास वर्तमान में है। यह एक पूर्ण उपयोगकर्ता वस्तु देता है। मैं केवल फ़ील्ड्स को वापस कैसे लौटा सकता हूं जो एपीआई कॉलर रनटाइम पर "फील्ड" पैरामाइटर के आधार पर चाहता है? मैं अन्य क्षेत्रों को नल बनाना नहीं चाहता हूं। मैं बस उन्हें वापस नहीं करना चाहता।
@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 सेवा विधि संशोधित इस प्रकार है:
@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();
}
}
मैं और अधिक परीक्षण लेकिन अब तक तो अच्छा करने की ज़रूरत है।
यदि मैं फ़ील्ड क्वेरी पैरामीटर विकल्प केस असंवेदनशील बनाना चाहता हूं तो क्या होगा? –