美文网首页
【Axios】配置

【Axios】配置

作者: 大Q本Q | 来源:发表于2019-07-08 10:40 被阅读0次

/**
 * vue发送请求的流程
 * page --params--> vuex --params--> api.js --formateParams--> vuex --formateParams--> axios
 */


import axios from 'axios'

// 取消请求的token
let CancelToken = axios.CancelToken;
let source = CancelToken.source();


axios.defaults.baseURL = process.env.VUE_APP_API_BASIC_PATH;
axios.defaults.timeout = 30 * 1000;


/**
 * 添加请求拦截器
 * 用于设置Authorization等
 */
axios.interceptors.request.use(
    function (config) {
        // axios的get请求,默认不带Content-Type,所以手动使Content-Type生效
        if (config.method == 'get') {
            config.data = true
        }
        // 设置身份认证信息
        let auth = localStorage.getItem('auth');
        if (auth) {
            config.auth = JSON.parse(localStorage.getItem('auth'));
        }
        return config;
    },
    function (error) {
        return Promise.reject(error);
    }
);

/**
 * 添加响应拦截器
 * 用于处理响应的数据错误信息
 */
axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;
}, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
});


/**
 * 取消请求
 * 放在项目的全局调用里(vuex),在跳转页面时,将请求全部清除
 * cancelRequest('取消上传的原因')
 */
let cancelRequest = source.cancel;


/**
 * 发起请求

 let option = {
    method:'post',                      // * 必填 *。
    url:'users/id-123',                 // * 必填 *。
    baseURL:'https://www.***.com/api/', // 选填。只有在请求地址不是axios.default.baseURL时需要
    headers:{},                         // 选填。有自定义的headers属性时填写
    data:{},                            // 选填。
    params:{id:'id-123'},              // 选填。 url上的参数, ?id=id-123

    auth:{username:'',password:''},     //
    timeout:1000,                       // 选填。
    responseType:'json',                // 选填。表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'

    onUploadProgress:function(e){},     // 选填。
    onDownloadProgress:function(e){},   // 选填。

    cancelToken:source.token,           // 选填。单独加cancelToken,比如在上传时,不想页面跳转时,随着其他请求被清除,这时候单独生成cancelToken。使用方法在下面。

    maxContentLength:1000,              // 选填。
    maxRedirects:5,                     // 选填。最大的重定向数目
 }
 request(option).then().catch()

 */

function request(option) {
    let option_init = {
        cancelToken: source.token,
        // method,
        // url,
        // baseURL,
        // params:{},
        // data:{},
        headers: {},
        // auth:{},
        // responseType:'json',
        // onUploadProgress:null,
        // onDownloadProgress:null,
        // maxContentLength:0,
        validateStatus,                         // status在200-300之间,执行resolve,否则reject
        transformRequest: [transformRequest],    // 发送前修改数据;PUT,POST,PATCCH有效; 返回:string、arrayBuffer、stream
        transformResponse: [transformResponse],  // 在then、catch前,修改响应数据

    };
    let option_finally = Object.assign({}, option_init, option);
    return axios(option_finally).then(res => {
        return new Promise((resolve, reject) => {
            let status = res.status;
            if (/^4/.test(status) || /^5/.test(status)) {
                // console.error('请求出错',res)
                reject(res)
            } else {
                resolve(res.data)
            }

        })
    })
}

// status在200-300之间,执行resolve,否则reject
function validateStatus(status) {
    return status >= 200 && status < 300;
}

// 发送前修改数据;PUT,POST,PATCCH有效; 返回:string、arrayBuffer、stream
function transformRequest(data) {
    return data;
}

// 在then、catch前,修改响应数据
function transformResponse(data) {
    return data && (typeof data) == 'string' ? JSON.parse(data) : data;
}


/******************************************************
 * 取消请求示例1,建议在跳转页面时,取消先前的所有未完成请求
 *
 var CancelToken = axios.CancelToken;
 var source = CancelToken.source();


 axios.get('home', {
        cancelToken: source.token,
        headers: {
            'content-type': 'image/jpeg11'
        }
    }
 )
 .catch(function (thrown) {
        if (axios.isCancel(thrown)) {
            console.log('Request canceled', thrown.message);
        } else {
            // 处理错误
        }
    });


 // 取消请求(message 参数是可选的)
 source.cancel('Operation canceled by the user.');
 ******************************************************/


/*******************************************************
 * 取消请求示例2
 *
 var CancelToken = axios.CancelToken;
 var cancel;

 axios.get('/user/12345', {
    cancelToken: new CancelToken(function executor(c) {
        // executor 函数接收一个 cancel 函数作为参数
        cancel = c;
    })
});

 // 取消请求
 cancel();

 ******************************************************/

export {
    axios,
    cancelRequest,
    request
}

相关文章

网友评论

      本文标题:【Axios】配置

      本文链接:https://www.haomeiwen.com/subject/cponhctx.html