axios post application/x-www-form-urlencoded 配置

3,802 阅读2分钟

问题背景

习惯了和接口通过json的格式交互,突然接了一个接口,给我讲,他的接口不是jsondata的数据格式而是formdata的格式,瞬间又点懵逼,又是第一次使用axios这个库,不知道该怎么传参数,尝试了几次没搞定,有必要好好搞清楚一下post传递参数的几种方式和不同的请求库如何配置的问题。

POST的几种提交方式

我们知道,HTTP是建立在 TCP/IP 协议之上的应用层协议。HTTP 请求主要分为三个部分:状态行、请求头、消息主体。
协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但是没有规定采用哪种格式,只要客户端和服务端协商好能互相解析出来就可以了。
客户端可以通过header中的 Content-Type 字段告诉服务端采用哪种编码,同时消息体中也要按照声明好的编码格式来编码,常见的编码格式有四种:

application/json

这个是我的项目中最常用的一种,我觉得这种格式的好处是抓包的时候非常直观,能够很清楚的看到data的结构。
axios默认Content-type是采用application/json;charset=UTF-8,无需设置直接把对象传进去即可。贼方便。

application/x-www-form-urlencoded

ajax 中, contentType都是默认的值:application/x-www-form-urlencoded
特点是提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 会进行了 URL 转码。
那么使用axios需要怎样设置才能使用此种编码格式呢(比较特殊)?
如果我们需要采用表单上传的方式(application/x-www-form-urlencoded)来给后台传递数据的话,则需要引入qs库,qs库在我们 安装 axios的时候就已经给我们默认安装了 这个时候 我们需要将参数转换一下:

import qs from 'qs'
export function post (url, data = {}) {
  return new Promise((resolve, reject) => {
    axios.post(url, qs.stringify(data))
      .then(response => {
        resolve(response.data)
      }, err => {
        reject(err)
      })
  })

如上即可。

multipart/form-data

这也是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,就要让 form 的 enctype 等于这个值。这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持。这个和application/x-www-form-urlencoded的区别在于一个适合传字段键值,一个适合传文件。

text/xml

和application/json的区别是把传输的格式换成xml格式,结构复杂,臃肿。反正我是不会用。