@RequestBody মাল্টিভ্যালুম্যাপের জন্য সামগ্রী প্রকারের 'অ্যাপ্লিকেশন / x-www-form-urlencoded; চরসেট = ইউটিএফ -8' সমর্থিত নয়


94

X-www-form-urlencoded স্প্রিং @ কন্ট্রোলারের সাথে সমস্যার উত্তরের ভিত্তিতে

আমি নীচের @ কন্ট্রোলার পদ্ধতিটি লিখেছি

@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"} যুক্ত করেছেন?
শিলাদিত্য

4
আপনি কীভাবে অনুরোধটি কার্যকর করলেন? (জেএস, জ্যাকোয়ারি, কার্ল বা আপনি যা ব্যবহার করুন) কোড যুক্ত করুন।
নিকোলে রুসেভ

আমি একই সমস্যা আছে। আমার ক্ষেত্রে আমি ডেটা পোস্ট করতে jquery JSON.stringify({"ordersToDownload":"00417002"}
আজাক্স

এটি আমি ব্যবহার করি কোড:$.ajax({url:"/myurl", type:"POST", data: JSON.stringify({"someAttribute":"someData"}) })
আরশসফ্ট

উত্তর:


126

সমস্যাটি হ'ল আমরা যখন অ্যাপ্লিকেশন / x-www-form- urlencoded ব্যবহার করি তখন স্প্রিং এটিকে একটি অনুরোধবডি হিসাবে বুঝতে পারে না। সুতরাং, আমরা এটি ব্যবহার করতে চাইলে আমাদের অবশ্যই @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 টীকা মুছে ফেলেছে

উত্তর : কনটেন্ট টাইপ অ্যাপ্লিকেশন / এক্স-www-ফর্ম-urlencoded সহ এইচটিপি পোস্ট অনুরোধ স্প্রিংয়ে কাজ করছে না


ধন্যবাদ! সমস্যা সমাধান করে। এখন আমি ভাবছি কীভাবে আমরা স্পষ্টভাবে এটিকে সরিয়ে দেব application/x-www-form-urlencoded?
খোলোফেলো মেলোমা

4
এটি প্রয়োজন নেই @ খলোফেলো মালোমা
ডগলাস রিবেইরো

যদি কেউ আশ্চর্য হয়ে থাকে যে এটি কোনও টিকা ছাড়াই কেন কাজ করে তবে মনে হয় যে স্প্রিং কোনও অ-টিকা যুক্তিগুলি এমনভাবে পরিচালনা করে যেন তাদের কাছে @ModelAttribute, even though this behaviour is (sadly) not documented. And @ মডেলঅ্যাট্রিবিউট এক্স-www-ফর্ম-urlencoded বুঝতে পারে
ক্র্যানফিন Ap

সর্বজনীন প্রতিক্রিয়া <?> getToken (মাল্টিভ্যালিউম্যাপ প্যারাম্যাপ) অবৈধআর্গুমেন্টের ধারণা: যুক্তির ধরণ মিলছে না
এককভাবে

তথ্যের জন্য ধন্যবাদ! নবাগত হিসাবে আমি ভাবছি যে স্প্রিংয়ের পেওলোডকে পার্স করা এবং এটি আপত্তিতে আবদ্ধ করার জন্য এই ছোট্ট অদ্ভুত আচরণের পেছনের কারণ কী?
hafan96

66

দেখে মনে হচ্ছে এখন আপনি কেবল পদ্ধতি প্যারামিটারটি চিহ্নিত করতে পারেন @RequestParamএবং এটি আপনার পক্ষে কাজটি করবে।

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

18

অ্যাপ্লিকেশন / জেসসনে সামগ্রী প্রকার সেট করার জন্য আপনার অনুরোধে একটি শিরোনাম যুক্ত করুন

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

এইভাবে বসন্ত কীভাবে সামগ্রীকে বিশ্লেষণ করতে জানে।


আপনার কমান্ডে আপনাকে একটি স্বীকৃতি শিরোনাম যোগ করার দরকার হতে পারে: 'কার্ল -ভেক-এইচ "স্বীকার করুন: অ্যাপ্লিকেশন / জেসন" -এইচ "বিষয়বস্তুর ধরণ: অ্যাপ্লিকেশন /
জেসন

4
আপনি কীভাবে আমার এইচটিএমএল ফর্মটিতে এই সেটিংটি যুক্ত করবেন তা দয়া করে ব্যাখ্যা করতে পারেন?
ওসামা আল-বান্না

8

বসন্তে 5

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

    // import org.springframework.util.MultiValueMap;

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

হ্যাঁ, ম্যাপিংয়ের ক্ষেত্রে ভোক্তা = মিডিয়াটাইপ.এপিপিএলিকেশন_এফএআরএম_ইউরএলএনসিওডি_ভ্যালু অন্তর্ভুক্ত করে, আপনি আরও পয়েন্ট প্রাপ্য স্যার! ধন্যবাদ! অনুরোধটি থেকে মাল্টিভ্যালু
ম্যাপটি

2

কেবল @RequestBodyটীকা মুছে ফেলা সমস্যার সমাধান করে (স্প্রিং বুট 2 এ পরীক্ষিত):

@RestController
public class MyController {

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

1

আমি স্ট্যাকওভারফ্লো উত্তরের একটি বিকল্প সম্পর্কে লিখেছি ।

সেখানে আমি ধাপে ধাপে লিখেছি, কোড দিয়ে ব্যাখ্যা দিয়েছি। সংক্ষিপ্ত উপায়:

প্রথম : একটি বস্তু লিখুন

দ্বিতীয় : অ্যাবস্ট্রাকটিএইচটিপিম্যাসেজ কনভার্টর প্রসারিত মডেলকে ম্যাপিংয়ের জন্য একটি রূপান্তরকারী তৈরি করুন

তৃতীয় : এই কনভার্টরটি একটি ওয়েবএমভিসিসিফিগিউরার.ক্লাউস কনফিগারেশন মেসেজ কনভার্টার পদ্ধতিকে ওভাররাইড করে প্রয়োগ করে ব্যবহার করুন

চতুর্থ এবং চূড়ান্ত: আপনার নিয়ামকের অভ্যন্তরে ম্যাপিংয়ে এই প্রয়োগকরণ সেটিংসটি ব্যবহার করে = আপনার মিডিয়াতে টাইপ করুন AP

আমি স্প্রিং বুট 2 ব্যবহার করছি।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.