SpringBoot Content typeアプリケーション/x-www-form-urlencoded charset=UTF-8 not supported
10115 ワード
1.問題導入
今日appにインタフェースを調整する時1つの問題に出会って、インタフェースが使えないと言って、500の間違いを報告します.内容は:
明らかにリクエストヘッダの問題であり,解決策はヘッダに
3.後続思考
問題は解決できるが、私はネット上でまたいくつかの文章を探して深く解読した.
文章はこう書いてあります.
しばらくjavawebをしたことがなくて、少し疎遠になって、jsもあまり忘れていないので、今日の午後前後のインタラクションをする時、バックグラウンドに伝わるパラメータはいつも空で、フロントエンドコンソールはString parameter“xxx”is not presentの間違いを報告しました.
フロントエンドコード
バックエンドコード
前にエラーが発生したのは、@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という注釈で解決できる.
フロントエンドコード
バックエンドコード
理由:@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
今日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