Axios请求中Content-Type的使用总结

Axios请求头中的Content-Type常见的有3种:

    1.Content-Type:application/json

    2.Content-Type:application/x-www-form-urlencoded

    3.Content-Type:multipart/form-data


1.Content-Type: application/json

Axios中默认的请求类型,它声明了请求数据会以json字符串的形式发送。在php中,使用$_POST是接收不到的

var param = {
    name: 'p',
    children: {
        name: 'child'
    }
}
this.$axios.post(url, param)
    .then(res => console.dir(res))

o


2.Content-Type:application/x-www-form-urlencoded

由于第一种类型php接收不到,所以我们要使用Axios自带的qs.stringify()对参数进行序列化,序列化后Content-Type就变成了application/x-www-form-urlencoded,它声明了请求数据会以键值对(普通表单形式)的形式发送,

通过在src目录下新建axios文件夹,文件夹中新建index.js,设置请求拦截。内容如下:

import Vue from 'vue';
import axios from 'axios';
import qs from 'qs';//引入qs,axios在post参数时,要通过qs来格式化数据

// 添加请求拦截器
axios.interceptors.request.use( 
    config => {
        if (config.method == 'post') {
            config.data = qs.stringify(config.data);//对参数进行序列化
        }
        return config;
    },
    error => {
        console.log('请求出错啦');
        console.dir(error)
        return Promise.reject(error);
    }
);

// 添加响应拦截器
axios.interceptors.response.use(
    response => {
        return response;
	}, 
    error => {
        return Promise.reject(error);
    }
);
Vue.prototype.$axios = axios;

在main.js中引入Axios

import '@/axios';//引入axios

这样,在发送post请求时,Content-Type就会自动变成application/x-www-form-urlencoded了

但是这样做在上传图片时会有问题,接着看第3点


3.Content-Type:multipart/form-data

它一般用来上传文件,我的上传图片代码如下:

async selectedFile($event) {
    let formData = new FormData();
    formData.append('img', $event.target.files[0]);
    this.$axios.post(url, formData, {headers: {'Content-Type': 'multipart/form-data'}})
        .then(res => console.dir(res));
},

但是由于第2步中,我们对Axios的请求进行拦截,默认对参数进行序列化了,导致Content-Type总是为pplication/x-www-form-urlencoded。这时文件就会传不到后台

因此要对src/axios/index.js进行修改:

import Vue from 'vue';
import axios from 'axios';
import qs from 'qs';//引入qs,axios在post参数时,要通过qs来格式化数据

// 添加请求拦截器
axios.interceptors.request.use( 
    config => {
        // 以下两种判断方式任选
        if (config.headers['Content-Type'] == 'multipart/form-data') {
        // if (Reflect.getPrototypeOf(config.data).constructor.name == 'FormData') {
            // 请求类型 Content-Type: multipart/form-data
        } else if (config.method == 'post') {
            config.data = qs.stringify(config.data);
            // 经过qs.stringify序列化后,请求类型变成了application/x-www-form-urlencoded
        }
        return config;
    },
    error => {
        return Promise.reject(error);
    }
);

// 添加响应拦截器
axios.interceptors.response.use(
    response => {
        return response;
    }, 
    error => {
        return Promise.reject(error);
    }
);
Vue.prototype.$axios = axios;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值