SpringBoot Content typeアプリケーション/x-www-form-urlencoded charset=UTF-8 not supported

10115 ワード

1.問題導入
今日appにインタフェースを調整する時1つの問題に出会って、インタフェースが使えないと言って、500の間違いを報告します.内容は:{"msg":"Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported","code":500}2.問題解決
明らかにリクエストヘッダの問題であり,解決策はヘッダにcontent-Type: "application/json;charset=utf-8"を加えることで解決できる.
3.後続思考
問題は解決できるが、私はネット上でまたいくつかの文章を探して深く解読した.
文章はこう書いてあります.
しばらくjavawebをしたことがなくて、少し疎遠になって、jsもあまり忘れていないので、今日の午後前後のインタラクションをする時、バックグラウンドに伝わるパラメータはいつも空で、フロントエンドコンソールはString parameter“xxx”is not presentの間違いを報告しました.
フロントエンドコード
  $.ajax({
        type: 'GET',
        url: '/weibo/list',
        cache: 'false',
        data: {
            "startdt": formData['startdt'],
            "enddt": formData['enddt'],
            "provinceName": formData['provinceName']
        },
        dataType: 'json',
        //contentType : 'application/x-www-form-urlencoded;charset=UTF-8',
     headers : {
        'Content-Type' : 'application/json;charset=utf-8'
    },
        success: function (result) {...}

バックエンドコード
   @RequestMapping("/list")
   @ResponseBody
   public List<Object> getWeiboAndCellList(@RequestParam("startdt") String date1, @RequestParam("enddt") String date2, @RequestParam("provinceName") String province) {...}

前にエラーが発生したのは、@RequestParam注記を追加していないためです.その役割はHttpServeretRequest request,requestに等しいです.getParameter("").ただし、Content-Typeが「アプリケーション/x-www-form-urlencoded;charset=UTF-8」に設定されている場合、POSTリクエストでもGETリクエストでもパラメータの取得に成功しますが、「アプリケーション/json;charset=utf-8」に設定されている場合は、上記のエラーが報告されます.ajax伝JSON時に設定contenttypeがアプリケーション/jsonまたはtext/jsonの場合、JAVAでrequest.getParameter("")はなかなかデータを受信できません.これは、TomcatのHttpServeretRequestクラスの実装クラスがorgであるためである.apache.catalina.connector.Request(実際はorg.apache.coyote.Request).
$になるajax content-Typeがjsonの場合,@RequestBodyという注釈で解決できる.
フロントエンドコード
var obj ={};
obj["user"] = JSON.stringify(this.update);
obj["classRoomId"] = this.classRoomid;
$.ajax({
         type: 'POST',
         url: url,
         dataType: 'json',
         cache: false,
         headers : {
               'Content-Type' : 'application/json;charset=utf-8'
        },
        data: JSON.stringify(obj),
        success: function (result) {...}
});

バックエンドコード
@RequestMapping("/updateUser")
@ResponseBody
public User updateUser(@RequestBody Map<String, Object> map){...}

理由:@RequestParamの最下位はrequest.getParameter方式でパラメータを取得する、すなわち@RequestParamとrequest.getParameterは同じことです.requestを使うからです.getParameter()方式でパラメータを取得し、get方式におけるqueryStringの値を処理してもよいし、post方式におけるbody dataの値を処理してもよいので、@RequestParamはget方式におけるqueryStringの値を処理してもよいし、post方式におけるbody dataの値を処理してもよい.@RequestParamはContent-Type:アプリケーション/x-www-form-urlencoded符号化の内容を処理するために使用され、GET、POSTがコミットされる.
まとめ:@RequestBodyはJsonオブジェクトではなくjsonオブジェクトの文字列を受け入れ、ajaxリクエスト時にJsonオブジェクトであることが多く、JSONを用いる.stringify(data)方式でオブジェクトをjson文字列にすることができます.@RequestBodyは文字列を受信し、返されるパラメータはMapオブジェクトであってもよい.
アプリケーション/json ajaxリクエストでcontent-type:アプリケーション/json代表パラメータがjson文字列でバックグラウンドに渡されます.controller受信には@RequestBody受信パラメータが必要です.たとえば@RequestBody Mapmap、クラス受信@RequestBody Userを使用することもできます
アプリケーション/x-www-form-urlencoded ajaxリクエストでcontent-type:application/x-www-form-urlencodedはパラメータを表してキー値ペアでバックグラウンドに渡され、controller受信は@RequestParam(「param」)String paramのような単一のパラメータ受信が可能である.クラスでUser userを受信することもできます.パラメータ名は参照文書に一つ一つ対応する必要があります.https://www.cnblogs.com/shirandedan/p/7727326.html      https://blog.csdn.net/feiyst/article/details/88431621