日常开发中,后台请求接口使用post的时候有3种情况

  1. 普通的post请求,数据是以json的形式提交到后台,对应Content-type:application/json
  2. 上传文件,数据是以FormData的形式提交到后台,工具会自动处理请求头,对应Content-type:multipart/form-data
  3. 表单形式提交需要设置对应Content-type:application/x-www-form-urlencoded
Content-Type: application/json : 
请求体中的数据会以json字符串的形式发送到后端
Content-Type: application/x-www-form-urlencoded:
请求体中的数据会以普通表单形式(键值对)发送到后端
Content-Type: multipart/form-data: 
它会将请求体的数据处理为一条消息,以标签为单元,用分隔符分开。
既可以上传键值对,也可以上传文件。

项目中遇到了需要表单形式的提交,然后设置了Content-type,结果请求的时候没有生效,找了好久原因,也Google了好久都没解决,最后静下心来检查了一下代码,发现是axios封装的有问题
封装代码如下:

 // 请求拦截器
  /****** request拦截器==>对请求参数做处理 ******/
service.interceptors.request.use(config => {
  app.$vux.loading.show({
    text: '数据加载中……'
  });
 
  config.headers = {
        "Accept-Language":"en-CN;q=1.0",
        "source_type":"apple-appstore",
        "version_code":"5.4.8",
        "Content-Type":"application/json",
        "push_device_type":"4",
        "Accept": "*/*"
      }
 
  return config;
}, error => { //请求错误处理
  app.$vux.toast.show({
    type: 'warn',
    text: error
  });
  Promise.reject(error)
})

接口请求代码如下:

export function checkBlackWord(baseURL,data){
    return request.request({
        url:"/v1/Message/CheckBlackWord",
        method:"post",
        data:qs.stringify(data),
        baseURL,
        headers:{
            "Content-Type": "application/x-www-form-urlencoded"
        }
    })
}

如上造成的现象是接口请求中设置的"Content-Type": "application/x-www-form-urlencoded不生效,浏览器调试显示的依然是Content-Type":"application/json
最后定位原因是axios请求封装直接设置headers为一个新对象,这种不管接口请求中设置任何header都会被覆盖,所以修改后如下:

 // 请求拦截器
  /****** request拦截器==>对请求参数做处理 ******/
service.interceptors.request.use(config => {
  app.$vux.loading.show({
    text: '数据加载中……'
  });
 
  let headers = {
        "Accept-Language":"en-CN;q=1.0",
        "source_type":"apple-appstore",
        "version_code":"5.4.8",
        "Content-Type":"application/json",
        "push_device_type":"4",
        "Accept": "*/*"
      }
  config.headers = {...headers,...config.headers}//如果不这样写,那么在接口中设置的header都会被覆盖
  return config;
}, error => { //请求错误处理
  app.$vux.toast.show({
    type: 'warn',
    text: error
  });
  Promise.reject(error)
})

利用对象的解构赋值语法,合并接口的配置和统一的配置

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐