सामग्री प्रकार 'आवेदन / x-www-form-urlencoded; चारसेट = UTF-8' @RequestBody MultiValueMap के लिए समर्थित नहीं


94

स्प्रिंग @Controller के साथ x-www-form-urlencoded के साथ समस्या के उत्तर के आधार पर

मैंने नीचे लिखा है @Controller विधि

@RequestMapping(value = "/{email}/authenticate", method = RequestMethod.POST
            , produces = {"application/json", "application/xml"}
            ,  consumes = {"application/x-www-form-urlencoded"}
    )
     public
        @ResponseBody
        Representation authenticate(@PathVariable("email") String anEmailAddress,
                                    @RequestBody MultiValueMap paramMap)
                throws Exception {


            if(paramMap == null || paramMap.get("password") == null) {
                throw new IllegalArgumentException("Password not provided");
            }
    }

अनुरोध जो नीचे की त्रुटि के साथ विफल हो जाता है

{
  "timestamp": 1447911866786,
  "status": 415,
  "error": "Unsupported Media Type",
  "exception": "org.springframework.web.HttpMediaTypeNotSupportedException",
  "message": "Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported",
  "path": "/users/usermail%40gmail.com/authenticate"
}

[पुनश्च: जर्सी कहीं अधिक मैत्रीपूर्ण था, लेकिन इसका उपयोग अब यहां व्यावहारिक प्रतिबंधों को देखते हुए नहीं कर सकता]


क्या आपने @RequestBody में उपभोग = = "आवेदन / x-www-form-urlencoded"} जोड़ा?
शिलादित्य 6

1
आपने अनुरोध को कैसे निष्पादित किया? (js, jquery, कर्ल या जो भी आप उपयोग करते हैं) का कोड जोड़ें।
निकोले रुसेव

मेरी भी यही समस्या है। मेरे मामले में मैं डेटा पोस्ट करने के लिए jquery ajax का उपयोग करता हूं और डेटा हैJSON.stringify({"ordersToDownload":"00417002"}
Arashsoft

यह वह कोड है जिसका मैं उपयोग करता हूं:$.ajax({url:"/myurl", type:"POST", data: JSON.stringify({"someAttribute":"someData"}) })
Arashsoft

जवाबों:


125

समस्या यह है कि जब हम एप्लिकेशन / x-www-form-urlencoded का उपयोग करते हैं , तो स्प्रिंग इसे RequestBody नहीं समझता है। इसलिए, यदि हम इसका उपयोग करना चाहते हैं तो हमें @RequestBody एनोटेशन को निकालना होगा ।

फिर निम्नलिखित प्रयास करें:

@RequestMapping(value = "/{email}/authenticate", method = RequestMethod.POST,
        consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, 
        produces = {MediaType.APPLICATION_ATOM_XML_VALUE, MediaType.APPLICATION_JSON_VALUE})
public @ResponseBody  Representation authenticate(@PathVariable("email") String anEmailAddress, MultiValueMap paramMap) throws Exception {
   if(paramMap == null && paramMap.get("password") == null) {
        throw new IllegalArgumentException("Password not provided");
    }
    return null;
}

ध्यान दें कि एनोटेशन @RequestBody को हटा दिया गया है

उत्तर : वसंत में काम नहीं कर रहे कंटेंट टाइप एप्लिकेशन / x-www-form-urlencoded के साथ Http पोस्ट का अनुरोध


धन्यवाद! समस्या हल करता है। अब मुझे आश्चर्य है कि हम स्पष्ट रूप से कैसे निकालते हैं application/x-www-form-urlencoded?
खलोफेलो मालोमा

1
यह आवश्यक नहीं है @kholofeloMaloma
डगलस रिबेरो

अगर किसी को आश्चर्य हो कि यह बिना किसी एनोटेशन के काम क्यों करता है, तो ऐसा लगता है कि स्प्रिंग किसी भी एनोटेट तर्क को संभालता है जैसे कि उनके पास @ModelAttribute, even though this behaviour is (sadly) not documented. And @ModelAttribute करता है, जो x-www-form-urlencoded समझ रहा है
क्रैनफिन

जनता की प्रतिक्रिया <>> getToken (MultiValueMap paramMap) IllegalArgumentException: तर्क प्रकार बेमेल
withoutOne

जानकारी के लिए धन्यवाद! एक नौसिखिया के रूप में, मैं सोच रहा हूं कि स्प्रिंग के पेलोड को पार्स करने और वस्तु को बांधने के लिए इस छोटे से अजीब व्यवहार के पीछे क्या कारण है?
hafan96

66

ऐसा लगता है कि अब आप केवल विधि पैरामीटर को चिह्नित कर सकते हैं @RequestParamऔर यह आपके लिए काम करेगा।

@PostMapping( "some/request/path" )
public void someControllerMethod( @RequestParam Map<String, String> body ) {
  //work with Map
}

18

एप्लिकेशन / json में सामग्री प्रकार सेट करने के लिए अपने अनुरोध में एक हेडर जोड़ें

curl -H 'Content-Type: application/json' -s -XPOST http://your.domain.com/ -d YOUR_JSON_BODY

इस तरह से वसंत सामग्री को पार्स करना जानता है।


आपको अपने कमांड में एक एक्सेप्ट हेडर भी जोड़ना पड़ सकता है: 'curl -vk -H "एक्सेप्ट: एप्लीकेशन / जसन" -H "कंटेंट-टाइप: एप्लीकेशन /
जसन

1
क्या आप बता सकते हैं कि इस सेटिंग को मेरे HTML फॉर्म में कैसे जोड़ा जाए?
ओसामा अल-बन्ना

8

वसंत 5 में

@PostMapping( "some/request/path" )
public void someControllerMethod( @RequestParam MultiValueMap body ) {

    // import org.springframework.util.MultiValueMap;

    String datax = (String) body .getFirst("datax");
}

हाँ, उपभोक्ता को शामिल करने के साथ = MediaType.APPLICATION_FORM_URLENCODED_VALUE मैपिंग में, आप अधिक अंक के पात्र हैं! धन्यवाद! @RequestParam अब अनुरोध से मल्टीवैल्यूपॅप लेने के लिए आवश्यक है
NemenjaT

2

बस @RequestBodyएनोटेशन को हटाने से समस्या हल हो जाती है (स्प्रिंग बूट 2 पर परीक्षण):

@RestController
public class MyController {

    @PostMapping
    public void method(@Valid RequestDto dto) {
       // method body ...
    }
}

1

मैंने इस StackOverflow उत्तर में एक विकल्प के बारे में लिखा ।

वहां मैंने कोड के साथ समझाते हुए कदम से कदम लिखा। संक्षिप्त तरीका:

पहला : एक वस्तु लिखें

दूसरा : AbstractHttpMessageConverter का विस्तार करने वाले मॉडल को मैप करने के लिए एक कनवर्टर बनाएं

तीसरा : स्प्रिंग को बताएं कि इस कन्वर्टर का उपयोग करके WebMvcConfigurer.class को कॉन्फ़िगर किया जा रहा है।

चौथा और अंतिम: अपने नियंत्रक के अंदर मैपिंग में इस कार्यान्वयन सेटिंग का उपयोग करके उपभोग करता है = MediaType.APPLICATION_FORM_URLENCODED_VALUE और @RequestBody आपकी वस्तु के सामने।

मैं स्प्रिंग बूट 2 का उपयोग कर रहा हूं।


0
@PostMapping(path = "/my/endpoint", consumes = { MediaType.APPLICATION_FORM_URLENCODED_VALUE })
public ResponseEntity<Void> handleBrowserSubmissions(MyDTO dto) throws Exception {
    ...
}

वह तरीका मेरे लिए काम करता है

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