前后端分离开发过程中需要进行接口联调,前端在与后端进行数据传递时,通常会用到GET、POST方法进行参数提交,而参数提交的方式,通常取决于server端对数据的接收方式,也可以通过改变server端接收参数的方式来进行前-->后数据的交互
1.Query String Parameters
Query String Parameters当发起一次GET请求时,参数会以url string的形式进行传递。即?后的字符串则为其请求参数,并以&作为分隔符。如下http请求报文头: headers:
传入参数:
后台@RequestParam就可以解析参数,该注解的作用在方法传递的参数前,用于接收所传参数,适用于get请求,用来接收问号后面的参数值(允许多个参数)。
指定传入的参数名称,其后面跟的参数名称一定要与前端传入的参数名称一致。
@RequestParam用的时候注意:
1.参数是否为必要参数,默认是true,非必要参数时需要@RequestParam(required=false)String name
2.参数的默认值(可配置)@RequestParam(defaultValue="xiaoli")String name
3.@RequestParam可以解决前后端定义的参数名不一致的问题,例如前端传入的参数名是name,后端方法接收的参数名是userName,这时可以通过@RequestParam指定value的值为name,实现name与userName的映射。@RequestParam(value="name")String userName
2.Request Payload
当发起一次POST请求时,若content-type为application/json,则参数会以Request Payload的形式进行传递(显然的,数据格式为JSON),不会显式出现在请求url中。 headers:
传入参数:
对于 Request Payload 请求, 必须加 @RequestBody
才能将请求正文解析到对应的 bean 中,且只能通过 request.getReader()
来获取请求正文内容
常见问题:
vue axois 请求接口默认解析为Request Payload,无法请求到服务端的API请求。
如果希望通过Form Data的方式来传递数据,则可以通过原生方法formData()来进行数据组装,且content-type需要设置为multipart/form-data。
解放方案: 将’Content-Type’:'applicacaton/json’改为:‘Content-Type’: ‘application/x-www-form-urlencoded’, 方法如下:
// 通用公用方法
const req = (method, url, params) => {
return axios({
method: method,
url: url,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
data: params,
traditional: true,
transformRequest: [
function(data) {
let ret = ''
for (let it in data) {
ret +=
encodeURIComponent(it) +
'=' +
encodeURIComponent(data[it]) +
'&'
}
return ret
}
]
}).then(res => res.data);};
3.Form Data
当发起一次POST请求时,若未指定content-type,则默认content-type为application/x-www-form-urlencoded。即参数会以Form Data的形式进行传递,不会显式出现在请求url中。
对于 Form Data 请求,无需任何注解,springmvc 会自动使用 MessageConverter 将请求参数解析到对应的 bean,且通过 request.getParameter(...)
能获取请求参数