axios的二次封装

208 阅读1分钟
// axios二次封装,目的:把当前项目中所有请求的公共部分进行统一处理
// + axios.defaults 设置公共的配置项
// + axios.interception 基于拦截器做统一处理

//配置接口的统一前缀【webpack环境 我们根据环境变量,设置不同的前缀,来区分不同的环境】
const env = process.env.NODE_ENV || 'development';
switch (env) {
    case 'development':
        axios.defaults.baseURL = 'http://...';
        break;
    case 'test':
        axios.defaults.baseURL = 'http://...';
        break;
    default:
        break;
}
axios.defaults.baseURL = 'http://...';
// 设置超时时间
axios.defaults.timeout = 10000;
// 跨域请求携带请求凭证
axios.defaults.withCredentials = true;
// 配置公共的自定义请求头信息 headers['common'] headers['post'] headers['get']
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
//post请求对于请求主体信息的统一格式化
axios.defaults.transformRequest = function(data,headers){
    if(data === null || typeof data !== 'object') return data;
    let contentType = headers['Content-Type'] || headers.post['Content-Type'];
    if(contentType.includes('urlencoded')) return Qs.stringify(data);
    if(contentType.includes('json')) return JSON.stringify(data);
    return data;
}
// 设置响应状态码的校验处理(服务器返回状态吗成功失败)
axios.defaults.validateStatus = function(status){
    return status >= 200 && status < 400;
}

// 请求拦截器 当所有配置想处理完,向服务器发送请求之前,拦截现有配置,在做一些统一修改
axios.interception.request.use(function(config){
    // 例如,传递token
    const token = sessionStorage.getItem('token');
    if(token){
        config.headers['Authorization'] = token;
    }
    return config;
})
//请求有结果后,我们在业务层自己调用then/catch方法拦截,可以统一做成功和失败处理
axios.interception.response.use(function onFulfilled(response){
    // 服务器正常返回结果&&validateStatus成功
    return response.data;
},function onRejected(reason){
    // 失败:1服务器返回结果,但是没有通过校验
    //      2服务器没有返回结果
    //      3请求中断或者超市
    let response = reason.response;
    if(response){
        // 1
        switch (response) {
            case 401:
                // ...
                break;
            default:
                break;
        }
    }else{
        // 2 navigator.onLine检测是否有网络
        if(!navigator.onLine){
            // 网络异常
        }
        // 3
        if(reason && /(TIMEOUT|ABOUT)/i.test(reason.code)){

        }
    }

    return Promise.reject(reason);
})


export default axios;

后续更新...