java - वसंत 4.x/3.x(वेब एमवीसी) आरईएसटी एपीआई और जेएसओएन 2 पोस्ट अनुरोध, सभी के लिए इसे सही तरीके से कैसे प्राप्त करें?




json spring (2)

कर्ल पोस्ट कॉल

curl -i -H "Content-Type: application/json" -X POST -d '{"id":100,"username":"JohnBlog","name":"John","lastName":"Blog","email":"[email protected]"}' http://localhost:8080/[YOURWEBAPP]/api/user/add

अलग त्रुटि परिदृश्य:

यहां मैं अलग-अलग त्रुटियों का पता लगाता हूं जो आप एक कर्ल कॉल करने के बाद आ सकते हैं और शायद गलत हो सकता है।

परिदृश्य एक:

HTTP/1.1 404 Not Found
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 949
Date: Tue, 04 Jun 2013 02:59:35 GMT

इसका तात्पर्य है कि आपके द्वारा प्रदान किए गए यूआरएल में आरईएसटी एपीआई मौजूद नहीं है।

मूल कारण:
  • आपके अनुरोध में आपके पास एक टाइपो हो सकता है (मुझे विश्वास है कि यह हो सकता है)!
  • यह हो सकता है कि आपकी वसंत विन्यास सही नहीं है। यदि ऐसा है तो इसे वास्तव में गलत तरीके से खोने की आवश्यकता है, लेकिन मैंने कुछ प्रारंभिक कार्रवाइयां प्रदान की हैं जो आपको अपनी परिष्कृत जांच शुरू करने से पहले करने की ज़रूरत है।
क्रियाएँ:

यह सुनिश्चित करने के बाद कि सबकुछ ठीक से किया गया है और आपके कॉन्फ़िगरेशन में कुछ भी गलत नहीं है और न ही आप यूआरएल: - एक मेवेन साफ़ करें। - अपने वेब ऐप को दोबारा नियोजित करें या इसे हटा दें। - वेब ऐप को दोबारा तैनात करें - अपने मेवेन / ग्रेडल में वसंत के केवल एक संस्करण का उपयोग करना सुनिश्चित करें

परिदृश्य दो:

HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 968
Date: Tue, 04 Jun 2013 03:08:05 GMT
Connection: close

इसके पीछे एकमात्र कारण यह है कि आपका अनुरोध सही रूप से स्वरूपित नहीं है। यदि आप विस्तृत कर्ल प्रतिक्रिया की जांच करते हैं तो आपको यह देखने में सक्षम होना चाहिए "क्लाइंट द्वारा भेजा गया अनुरोध वाक्यगत रूप से गलत था।"

मूल कारण:

या तो आपका JSON प्रारूप सही नहीं है या आप जावा ऑब्जेक्ट के लिए एक अनिवार्य पैरामीटर खो रहे हैं।

क्रियाएँ:

सुनिश्चित करें कि आप JSON ऑब्जेक्ट को सही प्रारूप में और पैरामीटर की सही संख्या के साथ प्रदान करते हैं। निरर्थक गुण अनिवार्य नहीं हैं लेकिन आपको सभी NotNullable गुणों के लिए डेटा प्रदान करना होगा। यह याद रखना बहुत महत्वपूर्ण है कि वसंत जावा जेएसओएन फ़ाइल को जावा ऑब्जेक्ट्स में बदलने के लिए जावा प्रतिबिंब का उपयोग कर रहा है, इसका क्या अर्थ है? इसका मतलब है कि परिवर्तनीय और विधि नाम CasE SensItiVe हैं। यदि आपकी JSON फ़ाइल आपके जावा ऑब्जेक्ट में आपके मिलान करने वाले चर के मुकाबले परिवर्तनीय "userName" भेज रही है, तो उसे "userName" भी नामित किया जाना चाहिए। यदि आपके पास गेटर्स और सेटर्स हैं, तो उन्हें भी उसी नियम का पालन करना होगा। हमारे पिछले उदाहरण से मेल खाने के लिए getUserName और setUserName प्राप्त करें।

सेनारियो तीन:

HTTP/1.1 415 Unsupported Media Type
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 1051
Date: Wed, 24 Aug 2011 08:50:17 GMT
मूल कारण:

जेसन मीडिया प्रकार आपकी वेब सेवा द्वारा समर्थित नहीं है। यह आपके एनोटेशन के कारण मीडिया प्रकार निर्दिष्ट नहीं कर सकता है या आप कर्ल पोस्ट कमांड में मीडिया प्रकार निर्दिष्ट नहीं कर सकते हैं।

क्रियाएँ:

जांचें कि आपका संदेश कन्वर्टर्स सही तरीके से स्थापित है और सुनिश्चित करें कि वेब सेवा एनोटेशन उपर्युक्त उदाहरण से मेल खाता है। यदि ये ठीक थे, तो सुनिश्चित करें कि आप अपने कर्ल पोस्ट अनुरोध में सामग्री-प्रकार निर्दिष्ट करते हैं।

जेसन मीडिया प्रकार आपकी वेब सेवा द्वारा समर्थित नहीं है।

सेनारियो एन (!):

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Content-Type: application/json;charset=UTF-8 
Transfer-Encoding: chunked 
Date: Tue, 04 Jun 2013 03:06:16 GMT 

बधाई देता है कि उपयोगकर्ता वास्तव में आपके सर्वर पक्ष REST API को भेजता है।

वसंत एमवीसी गाइड को अपने वसंत चेकआउट को कैसे सेट अप करें, इसके बारे में अधिक जानकारी के लिए।

संबंधित पोस्ट और प्रश्न

यह FAQ संभव नहीं था अगर यह उन सभी लोगों के लिए नहीं था जिन्होंने निम्नलिखित पद और प्रश्न प्रदान किए थे (यदि मैं उपयोगी संबंधित पोस्ट / प्रश्नों पर आती हूं तो यह सूची विस्तारित होगी):

  1. सही JSON सामग्री प्रकार क्या है?
  2. जैक्सन संदेश कनवर्टर का उपयोग कर वसंत 3.0 जेएसओएन प्रतिक्रिया बना रहा है
  3. स्प्रिंग आरईएसटी परीक्षण करने के लिए टर्मिनल / कमांडलाइन से कर्ल के साथ जेएसओएन डेटा कैसे पोस्ट करें?
  4. जेएसओएन को आरईएसटी एपीआई में पोस्ट करना
  5. https://github.com/geowarin/spring-mvc-examples
  6. जेएसओएन को कर्ल के साथ PHP पर कैसे पोस्ट करें
  7. वसंत आरईएसटी | मैपिंग जैक्सन एचटीपी मैसेज कनवर्टर अवैध JSON उत्पन्न करता है
  8. https://github.com/eugenp/REST
  9. स्प्रिंग वेब एमवीसी - व्यक्तिगत अनुरोध पैराम मान्य करें
  10. स्प्रिंग आरईएसटी परीक्षण करने के लिए टर्मिनल / कमांडलाइन से कर्ल के साथ जेएसओएन डेटा कैसे पोस्ट करें?
  11. आप Java Servlet से JSON ऑब्जेक्ट कैसे वापस करते हैं
  12. यदि आरईएसटी एपीआई द्वारा जेएसओएन वापस किया जा रहा है तो क्या एमआईएमई प्रकार?

विवरण में जाने से पहले, मुझे पता है कि स्टैक ओवरफ्लो पर कई बातचीत और संबंधित प्रश्न हैं। उन सभी ने मुझे विभिन्न तरीकों से मदद की है, इसलिए मैंने सोचा कि मैंने अपने निष्कर्षों को सारांशित करने के लिए एक ही संगठित एफएक्यू के रूप में अपने निष्कर्षों को एक साथ रखा है।

संबंधित अवधारणाएं

निश्चित रूप से आप इनके बारे में जानते हैं लेकिन मैं उन्हें तुरंत समीक्षा के रूप में लिखता हूं। अगर मुझे कुछ याद आ रहा है तो संपादित करने के लिए स्वतंत्र महसूस करें।

HTTP पोस्ट अनुरोध:

जब आप किसी ऑब्जेक्ट को किसी वेब सेवा या आपके सर्वर साइड एप्लिकेशन पर भेजने के इच्छुक होते हैं तो एक पोस्ट अनुरोध का उपयोग किया जाता है।

क्रमबद्धता:

क्या आपके वेब ब्राउज़र से ऑब्जेक्ट को आपके सर्वर साइड एप्लिकेशन में प्राप्त करने की प्रक्रिया है। एक jQuery अजाक्स कॉल या एक कर्ल पोस्ट अनुरोध का उपयोग किया जा सकता है।

सीरियलाइजेशन प्रोटोकॉल:

सबसे लोकप्रिय लोग थेसिस जेएसओएन और एक्सएमएल हैं। एक्सएमएल टैगिंग की प्रकृति के कारण सीरियलाइज्ड एक्सएमएल ऑब्जेक्ट आकार में अपेक्षाकृत बड़ा है क्योंकि एक्सएमएल कम लोकप्रिय हो रहा है। इस FAQ में मुख्य फोकस JSON2 क्रमबद्धता है।

वसंत:

वसंत ढांचे और इसकी शक्तिशाली एनोटेशन वेब सेवा को एक कुशल तरीके से बेनकाब करना संभव बनाता है। वसंत में कई अलग-अलग पुस्तकालय हैं। यहां हमारा ध्यान केंद्रित स्प्रिंग वेब एमवीसी है

कर्ल बनाम JQuery:

ये वे टूल हैं जिनका उपयोग आप अपने क्लाइंट साइड में पोस्ट अनुरोध करने के लिए कर सकते हैं। यहां तक ​​कि यदि आप JQuery AJAX कॉल का उपयोग करने की योजना बना रहे हैं, तो भी मेरा सुझाव है कि आप डिबगिंग उद्देश्यों के लिए कर्ल का उपयोग करें क्योंकि यह आपको पोस्ट अनुरोध करने के बाद विस्तृत प्रतिक्रिया प्रदान करता है।

@RequestBody बनाम @ RequestParam / @ PathVariable बनाम @ModelAttribute:

ऐसे मामलों में जहां आपके पास एक वेब सेवा है जो आपके जावा ईई मॉडल के आधार पर नहीं है, @RequestBody का उपयोग किया जाना चाहिए। यदि आप मॉडल का उपयोग कर रहे हैं और मॉडल में आपके JSON ऑब्जेक्ट को जोड़ा गया है, तो आप ऑब्जेक्ट को @ModelAttribute के माध्यम से एक्सेस कर सकते हैं। केवल उन मामलों के लिए जहां आपका अनुरोध या तो GET अनुरोध है या एक GET और POST अनुरोध संयोजन है, आपको @ RequestParam / @ PathVariable का उपयोग करने की आवश्यकता होगी।

@RequestBody बनाम @ResposeBody:

जैसा कि आप इसे नाम से जितना आसान देख सकते हैं, आपको केवल @ResponseBody की आवश्यकता है यदि आप सर्वर साइड विधि अनुरोध के संसाधित होने के बाद क्लाइंट को प्रतिक्रिया भेज रहे हैं।

RequestMappingHandlerAdapter बनाम AnnotationMethodHandlerAdapter:

RequestMappingHandlerAdapter स्प्रिंग फ्रेमवर्क के लिए नया मैपिंग हैंडलर है जो स्प्रिंग 3.1 के बाद एनोटेशन मोडस हैंडलर एडाप्टर को प्रतिस्थापित करता है। यदि आपकी मौजूदा कॉन्फ़िगरेशन अभी भी AnnotationMethodHandlerAdapter में है, तो आपको यह पोस्ट उपयोगी लगेगा। मेरे पोस्ट में प्रदान की गई कॉन्फ़िगरेशन आपको RequestMappingHandlerAdapter सेट अप करने के बारे में एक विचार देगा।

सेट अप

आपको एक संदेश परिवर्तक स्थापित करने की आवश्यकता होगी। इस प्रकार आपका सीरियलाइज्ड JSON संदेश निकाय आपके सर्वर पक्ष पर स्थानीय जावा ऑब्जेक्ट में परिवर्तित हो जाता है।

JSON2 से मूल विन्यास। कन्वर्टर्स JSON2 में मार्शलिंगिंग एचटीपी मैसेज कनवर्टर और कास्टर मार्शलर थे, मैंने उन्हें मैपिंग जैक्सन 2HttpMessageConverter और मैपिंग जैक्सनहट्पमेसेज कनवर्टर के साथ बदल दिया है।

कॉन्फ़िगरेशन कहां रखना है

जिस तरह से मेरी परियोजना स्थापित है, मेरे पास दो कॉन्फ़िगरेशन फ़ाइलें हैं:

  • एप्लिकेशन संदर्भ एक्सएमएल: यह एक एप्लीकेशन संदर्भ एक्सएमएल फ़ाइल है जहां आपका सत्र फैक्टरी बीन, डेटासोर्स बीन, आदि स्थित हैं।
  • एमवीसी डिस्पैचर सर्वलेट एक्सएमएल: यह वह जगह है जहां आपका दृश्य रिज़ॉल्वर बीन है और अपना एप्लीकेशन संदर्भ एक्सएमएल आयात करें।

हैडलर एडाप्टर बीन बाद में स्थित होना चाहिए जो एमवीसी डिस्पैचर एक्सएमएल फ़ाइल है।

<bean name="handlerAdapter"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
            <ref bean="jsonConverter"/>

        </list>

    </property>
    <property name="requireSession" value="false"/>

</bean>
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    <property name="supportedMediaTypes" value="application/json"/>
</bean>

आपके पास एकाधिक संदेश कन्वर्टर्स हो सकते हैं। यहां, मैंने एक सामान्य JSON के साथ-साथ एक JSON 2 संदेश कनवर्टर बनाया है। एक्सएमएल फ़ाइल में रेफरी और सामान्य बीन प्रारूप दोनों का इस्तेमाल किया गया है (व्यक्तिगत रूप से मैं अपने neater के रूप में रेफ टैग पसंद करते हैं)।

बाकी एपीआई

यहां एक नमूना नियंत्रक है जो आरईएसटी एपीआई का खुलासा कर रहा है।

नियंत्रक

यह वह जगह है जहां HTTP पोस्ट अनुरोध के लिए आपका REST API खुलासा किया गया है।

@Component
@Controller
@RequestMapping("/api/user")
public class UserController {
@RequestMapping(value = "/add", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String insertUser(@RequestBody final User user) {
    System.out.println(user.toString());
    userService.insertUser(user);
    String userAdded = "User-> {" + user.toString() + "} is added";
    System.out.println(userAdded);
        return userAdded;
    }
}

जावा ऑब्जेक्ट

@JsonAutoDetect
public class User {

private int id;
private String username;
private String name;
private String lastName;
private String email;

public int getId() {
    return externalId;
}

public void setId(final int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(final String name) {
    this.name = name;
}

public String getEmail() {
    return email;
}

public void setEmail(final String email) {
    this.email = email;
}
public String getUsername() {
    return username;
}

public void setUsername(final String username) {
    this.username = username;
}

public String getLastName() {
    return lastName;
}

public void setLastName(final String lastName) {
    this.lastName = lastName;
}

@Override
public String toString() {
    return this.getName() + " | " + this.getLastName()  + " | " + this.getEmail()
            + " | " + this.getUsername()  + " | " + this.getId()  + " | ";
    }

}

कर्ल पोस्ट कॉल

curl -i -H "Content-Type: application/json" -X POST -d '{"id":100,"username":"JohnBlog","name":"John","lastName":"Blog","email":"[email protected]"}' http://localhost:8080/[YOURWEBAPP]/api/user/add

संबंधित पोस्ट और प्रश्न

यह FAQ संभव नहीं था अगर यह उन सभी लोगों के लिए नहीं था जिन्होंने निम्नलिखित पद और प्रश्न प्रदान किए थे (यदि मैं उपयोगी संबंधित पोस्ट / प्रश्नों पर आती हूं तो यह सूची विस्तारित होगी):

  1. सही JSON सामग्री प्रकार क्या है?
  2. जैक्सन संदेश कनवर्टर का उपयोग कर वसंत 3.0 जेएसओएन प्रतिक्रिया बना रहा है
  3. स्प्रिंग आरईएसटी परीक्षण करने के लिए टर्मिनल / कमांडलाइन से कर्ल के साथ जेएसओएन डेटा कैसे पोस्ट करें?
  4. जेएसओएन को आरईएसटी एपीआई में पोस्ट करना
  5. https://github.com/geowarin/spring-mvc-examples
  6. जेएसओएन को कर्ल के साथ PHP पर कैसे पोस्ट करें
  7. वसंत आरईएसटी | मैपिंग जैक्सन एचटीपी मैसेज कनवर्टर अवैध JSON उत्पन्न करता है
  8. https://github.com/eugenp/REST
  9. स्प्रिंग वेब एमवीसी - व्यक्तिगत अनुरोध पैराम मान्य करें
  10. स्प्रिंग आरईएसटी परीक्षण करने के लिए टर्मिनल / कमांडलाइन से कर्ल के साथ जेएसओएन डेटा कैसे पोस्ट करें?
  11. आप Java Servlet से JSON ऑब्जेक्ट कैसे वापस करते हैं
  12. यदि आरईएसटी एपीआई द्वारा जेएसओएन वापस किया जा रहा है तो क्या एमआईएमई प्रकार?

यह ध्यान देने योग्य होना चाहिए कि एक बीन वर्ग को संभाला नहीं जा सकता है यदि उसके पास एक फ़ील्ड के लिए 2 या अधिक सेटर है, तो वैकल्पिक रूप से @JsonIgnore बिना। स्प्रिंग / जैक्सन फेंक HttpMediaTypeNotSupportedException और http स्थिति 415 असमर्थित मीडिया प्रकार।

उदाहरण :

@JsonGetter
public String getStatus() {
    return this.status;
}

@JsonSetter
public void setStatus(String status) {
    this.status = status;
}

@JsonIgnore
public void setStatus(StatusEnum status) {
    if (status == null) {
        throw new NullPointerException();
    }

    this.status = status.toString();
}

अपडेट करें: हमें इस मामले में @JsonGetter और @JsonSetter को भी निर्दिष्ट करना होगा, रिटर्न प्रकार के रूप में उपयोग किए जाने पर समस्याएं नहीं हैं।

वसंत 3.2.2 और जैक्सन 2.2 के साथ बस इसका परीक्षण किया। यह पैरामीटर ( @RequestBody ) और / या वापसी प्रकार ( @ResponseBody ) के रूप में ठीक काम करता है।

अद्यतन 2:

यदि @JsonGetter और @JsonSetter निर्दिष्ट हैं, तो @JsonIgnore आवश्यकता नहीं है।







html-post