一、前端传参须要注意请求的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}