@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.