一、前端傳參須要注意請求的Content-type:
主要使用的有兩種:application/x-www-form-urlencoded 、以及 application/json前端
二、application/x-www-form-urlencoded是瀏覽器的默認編碼格式 ,對於原生的form 表單提交參數,就是使用的這種方法。參數格式編碼後會成爲:key1=value1&key2=value2這樣的形式
它支持get和post兩種方式進行發送,對於get請求方式,會將編碼後的參數「key1=value1&key2=value2」添加到url的結尾。對於post方式的請求,會放在請求的body中。對於以這種編碼方式進行傳輸的請求參數,Controller端能夠直接經過 在方法中指定對應的參數名進行接收,或者經過Bean進行接收,Bean的成員變量名與請求的方法進行對應。web
@RequestMapping("/test") @ResponseBody public String test(User vo){ // Long id;String name System.out.println(vo.getId()); return "ok"; }
前端方法:ajax
xx.net.ajax({
url: `xx/test`,
method: 'get',
data: { id: 1, name: "50" },
success: data => {
console.log("ok")
}
});
若是這時在後端加註解@RequestBody,那麼會報錯:spring
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
三、若是前端框架,經過將參數經過JSON.stringfy(params)轉換成爲JSON字符串形式,那麼以application/x-www-form-urlencoded進行傳輸的時候,實際傳送的參數會是:json
{"id":1,"name":"50"}:
//這樣的參數是不符合key-value形式的,由於轉完以後實際上參數成爲了json字符串,而非key-value字符串
這樣的參數,經過get發送時,會變成這樣:後端
http://localhost:8080/iwatch/api/v2/dashboard/test?{%22id%22:1,%22name%22:%2250%22}
(其實是對 {"id":1,"name":"50"}: 這樣的字符串進行了轉碼)
//view source:{%22id%22:1,%22name%22:%2250%22}
//view pased:{"id":1,"name":"50"}:
經過post發送時會是這樣:api
{"id":1,"name":"50"}:
//view parsed如上面寫
//view source 內容以下圖
這樣的形式,這樣在後端就會接收不到參數.所以對於將參數轉換爲JSON字符串以後,須要將content-type指定爲:application/json,纔可以正確的傳輸.而且須要配合使用post方法發送請求。瀏覽器
四、若是將參數對象轉爲了JOSN字符串,後端接受參數較爲嚴格:前端框架
須要app
a、使用content-type指定爲application/json
b、須要配合使用post方法,才能發送成功
xx.net.ajax({
url: `xx/test`,
method: 'get',
data: JSON.stringify({ id: 1, name: "50" }),
success: data => {
console.log("ok")
}
});
c、後端須要指定:@RequestBody來 將參數綁定到bean .(能夠默認爲@RequestBody爲application/json編碼格式服務)
@RequestMapping("/test")
@ResponseBody
public String test(@RequsetBody User vo){ // Long id;String name
System.out.println(vo.getId());
return "ok";
}
d、當前端使用application/json編碼,而且參數爲json字符串後,就只能以post方法發送請求了,不然get請求後面的參數爲一個urlEncode以後的json字符串,根本無法發送參數。
http://localhost:8080/test?{%22id%22:1,%22name%22:%2250%22}