1. 背景:
在使用axios进行Post请求后端接口的时候,后端无法获取传参。
2. 原因:
使用axios调用接口的时候,对于参数接口往往期望得到一个以key/val格式为传输数据的multipart/formdata(多用于传输文件)或x-www-form-urlencoded(form标签的默认content-type)
axios默认传的是用application/json的json格式,那么后台就拿不到传参。例如php中接收参数的变量$_POST就无法获取application/json的参数(tp框架内置的助手函数input可以)
那么为什么get可以传输呢?
GET 请求不存在请求实体部分,键值对参数放置在 URL 尾部,浏览器把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串追加到url后面,用?分割,加载这个新的url。因此请求头不需要设置 Content-Type 字段,设置了也不会去使用。
3. 解决办如下:
对于字符串参数,axios是会自动转为 application/x-www-form-urlencoded ,所以(1)(2)(3)方法都不需要额外配置“application/x-www-form-urlencoded”了
(1) new FormData()
let formData = new FormData();
for (let key of Object.keys(obj)) {
formData.append(key, obj[key]);
}
(2) URLSearchParams
var formData = new URLSearchParams();
for (let key of Object.keys(obj)) {
formData.append(key, obj[key]);
}
(3) qs库
这也是最多人使用的方法
import qs from 'qs' // qs在安装axios后会自动安装,只需要组件里import一下即可
// 代码省略...
dataObj = qs.stringify(dataObj) // 得到转换后的数据为 string 类型
//dataObj = qs.stringify(dataObj,{indices:true}) // 传数组时以下标的形式
this.$axios({
method: 'post',
url: 'https://jsonplaceholder.typicode.com/posts',
// headers: {
// 'Content-Type': 'application/x-www-form-urlencoded'
// },
data: dataObj, // 直接提交转换后的数据即可
})
content-type的总结请看另一篇 JS-总结-ajax请求时content-type详解.md