美文网首页
【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