स्प्रिंग एमवीसी में स्पष्ट रूप से पोस्ट डेटा कैसे प्राप्त करें?


82

क्या पोस्ट डेटा स्वयं प्राप्त करने का एक तरीका है? मुझे पता है कि वसंत जावा डेटा को पोस्ट डेटा बाइंडिंग संभालता है। लेकिन, दो क्षेत्रों को देखते हुए जिन्हें मैं संसाधित करना चाहता हूं, मैं उस डेटा को कैसे प्राप्त कर सकता हूं?

उदाहरण के लिए, मान लीजिए कि मेरे फॉर्म में दो फ़ील्ड थे:

 <input type="text" name="value1" id="value1"/>
 <input type="text" name="value2" id="value2"/>

मैं अपने नियंत्रक में उन मूल्यों को कैसे पुनः प्राप्त करूंगा?

जवाबों:


135

यदि आप अंतर्निहित नियंत्रक इंस्टेंस में से किसी एक का उपयोग कर रहे हैं, तो आपके नियंत्रक विधि के मापदंडों में से एक अनुरोध ऑब्जेक्ट होगा। आप request.getParameter("value1")POST (या PUT) डेटा मान प्राप्त करने के लिए कॉल कर सकते हैं ।

यदि आप स्प्रिंग MVC एनोटेशन का उपयोग कर रहे हैं, तो आप अपने तरीके के मापदंडों में एनोटेट पैरामीटर जोड़ सकते हैं:

@RequestMapping(value = "/someUrl")
public String someMethod(@RequestParam("value1") String valueOne) {
 //do stuff with valueOne variable here
}

1
क्या यह मल्टीप्ल रिक्वेस्ट पैरामीटर्स के साथ काम करता है, यह सही है? आपको एक वस्तु में लपेटना नहीं है? stackoverflow.com/q/12862320/106261
NimChimpsky

1
<3 इसे ऐसे समय के लिए जब आप मॉडल-समर्थित फ़ॉर्म (खोज फ़ॉर्म, या संपर्क फ़ॉर्म, आदि) के लिए नहीं चाहते / चाहते हैं
डॉन चेडल

38

ओपी के सटीक प्रश्न का एक अन्य उत्तर consumesसामग्री प्रकार को सेट करना "text/plain"और फिर एक @RequestBody Stringइनपुट पैरामीटर घोषित करना है । यह POST डेटा के पाठ को घोषित Stringचर के रूप में ( postPayloadनिम्नलिखित उदाहरण में) पारित करेगा ।

बेशक, यह माना जाता है कि आपका POST पेलोड टेक्स्ट डेटा है (जैसा कि ओपी ने कहा था)।

उदाहरण:

    @RequestMapping(value = "/your/url/here", method = RequestMethod.POST, consumes = "text/plain")
    public ModelAndView someMethod(@RequestBody String postPayload) {    
        // ...    
    }

3
यह वह उत्तर है जिसकी मुझे तलाश थी। 'पोस्ट डेटा ही' से मैं यही समझता हूं। धन्यवाद!
मौरोमार्टिनी

कई पोस्ट परम के लिए (जैसे कि value1और value2, यह दोनों मानों के लिए एक स्ट्रिंग पैदा करेगा? फिर आपको अलग-अलग मूल्यों को पार्स करने की आवश्यकता होगी? आप ऐसा क्यों करते हैं जब आप स्वीकार किए गए उत्तर में प्रत्येक मूल्य को व्यक्तिगत रूप से निर्दिष्ट / प्राप्त कर सकते हैं?
डॉन चीडल

1
@mmcrae - यह समस्या को हल करने के लिए बस एक और तरीका है, और शायद उन अन्य उपयोगकर्ताओं के लिए उपयोगी है जिनके पास कई POST params नहीं हैं, बल्कि उनके पास केवल पाठ या बाइनरी डेटा का एक ब्लॉब है। यह मेरी स्थिति थी, और जब मैं इस प्रश्न पर क्लिक करने की उम्मीद कर रहा था, तो मैं यही सीख रहा था।
सिमोन

1
ठीक वही जो मेरे द्वारा खोजा जा रहा था। यह खपत के साथ काम करता है = "एप्लीकेशन / json" भी अगर json पोस्ट कर रहा है।
मनीष

नमस्ते। मैं अपने एपीआई का परीक्षण करने के लिए पोस्टमैन का उपयोग कर रहा हूं । पोस्टमैन डेटा के साथ POST के लिए बॉडी को भरने में मेरी मदद करता है। समस्या यह है कि जब मैं उपयोग करता हूं तो मुझे 403 मिलते हैं RequestMethod.POST। मैंने भी जोड़ा @CrossOrigin(origins = "*")लेकिन मुझे अभी भी वही मिलता है ... पता नहीं क्या चल रहा है ... मैंने आपके उत्तर के रूप में उसी हस्ताक्षर का उपयोग किया है (इसके अलावा मेरे मामले में someMethodरिटर्न String)
कर्ट मिलर

27

स्प्रिंग एमवीसी सर्वलेट एपीआई के शीर्ष पर चलता है। तो, आप इसके लिए उपयोग कर सकते हैं HttpServletRequest#getParameter():

String value1 = request.getParameter("value1");
String value2 = request.getParameter("value2");

HttpServletRequestपहले से ही करने की विधि तर्क के रूप में वसंत MVC के अंदर आप के लिए उपलब्ध होना चाहिए handleRequest()विधि।


1
हाई @BalusC, मेरे मामले में मेरे पास अनुरोध में 20 से अधिक चर हैं। हालाँकि मेरे पास सभी अनुरोध परम चर के साथ एक सेम है। अब मैं सभी मूल्यों को एक-एक करके प्राप्त करने के बजाय अनुरोध से सेम में लाना चाहता हूं। हमारे पास "ModelDrivenBean" का उपयोग करके struts2 में यह सुविधा है। क्या हमारे पास वसंत ढांचे में इस तरह की कोई विशेषता है।
विस्सु

2
हां, @ModelAttribute एनोटेशन और फॉर्म बैकिंग बीन का उपयोग करना। यह लिंक अच्छी तरह से वर्णन करता है कि ऐसा कैसे करें: viralpatel.net/blogs/2010/07/spring-3-mvc-handling-forms.html

@vissu यदि आपके पास 20 से अधिक चर हैं तो आपको वास्तव में सरलीकरण करना चाहिए
CodeMonkey

1
नमस्ते बालुसक। नीचे सिमोन के जवाब के बाद मैं अपने एपीआई का परीक्षण करने के लिए पोस्टमैन का उपयोग कर रहा हूं । पोस्टमैन डेटा के साथ POST के लिए बॉडी को भरने में मेरी मदद करता है। समस्या यह है कि जब मैं उपयोग करता हूं तो मुझे 403 मिलते हैं RequestMethod.POST। मैंने भी जोड़ा @CrossOrigin(origins = "*")लेकिन मुझे अभी भी वही मिलता है ... पता नहीं क्या चल रहा है ... मैंने आपके उत्तर के रूप में उसी हस्ताक्षर का उपयोग किया है (इसके अलावा मेरे मामले में someMethodरिटर्न String)
कर्ट मिलर

0

आप बस अपने नियंत्रक में किसी भी एनोटेशन के बिना इच्छित विशेषता को पास कर सकते हैं:

@RequestMapping(value = "/someUrl")
public String someMethod(String valueOne) {
 //do stuff with valueOne variable here
}

GET और POST के साथ काम करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.