在使用axios时,注意到配置选项中包含params和data两者
①params是添加到url的请求字符串中的,用于get请求。
②data是添加到请求体(body)中的, 用于post请求。
vue开发推荐使用axios进行ajax异步请求,然而使用axios进行post表单提交时默认使用的Content-Type“为application/json”
而大多数的web服务器只能识别post请求头Content-Type为“application/x-www-form-urlencoded”,如下两种解决方法:
一、修改服务器端:使其能够接收Content-Type为application/json的请求(如springmvc添加@requestBody注解等等)
二、修改前端:axios中post提交数据的三种请求方式写法
1、Content-Type: application/json(默认)
import axios from 'axios'
let data = {"code":"1234","name":"yyyy"};
axios.post(`${this.$url}/test/testRequest`,data)
.then(res=>{
console.log('res=>',res);
})
2、Content-Type: application/x-www-form-urlencoded(普通表单提交、JQuery Ajax表单提交以及大多数web服务器默认识别的post请求头)
①使用qs(推荐使用)
在项目中使用命令行工具输入:npm install qs
安装完成后在需要用到的组件中:import qs from 'qs’
qs.parse()是将URL解析成对象的形式
qs.stringify()是将对象 序列化成URL的形式,以&进行拼接
import axios from 'axios'
import qs from 'qs'
let data = {"code":"1234","name":"yyyy"};
axios.post(`${this.$url}/test/testRequest`,qs.stringify({
data
}))
.then(res=>{
console.log('res=>',res);
})
②使用URLSearchParams
import axios from 'axios'
let data = new URLSearchParams()
data.append('code', '1234')
data.append('name', 'yyyy')
axios.post(`${this.$url}/test/testRequest`, data )
.then(res=>{
console.log('res=>',res);
})
PS:使用qs或URLSearchParams自动会把Content-Type设置为application/x-www-form-urlencoded,如果未自动设置,axios也支持自定义headers头
headers:{
'Content-Type':'application/x-www-form-urlencoded'
}
3、Content-Type: multipart/form-data
import axios from 'axios'
let data = new FormData();
data.append('code','1234');
data.append('name','yyyy');
axios.post(`${this.$url}/test/testRequest`,data)
.then(res=>{
console.log('res=>',res);
})
参考地址:
https://segmentfault.com/a/1190000015261229
https://blog.youkuaiyun.com/u014418725/article/details/80700711