axios如何提交formdata


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 字段,设置了也不会去使用。

www.bilibili.com?name=落沉雪

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


文章作者: iamfugui
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 iamfugui !
评论
  目录