axios的二次配置,提取当前项目中,所有请求的公共部分的配置项 Axios内部的配置项(内部的默认值)->提取的公共配置项的值 ->发送请求自己写的配置项的值{权重最高}

    1. 所以如果100个请求,其中99个用的公共配置项即可,但有一个和公共配置项不一样,此时我们只需要在单独发送请求的时候,按照自己的要求重写一遍配置项即可{自己写的权重最高}
    • axios.defaults.xxx=xxx 默认

    • axios.interceptors.request/response 拦截器

    // 验证是否为纯粹的对象 「直属类是Object || Object.create(null)」
    const isPlainObject = function isPlainObject(obj) {
        let proto, Ctor;//原型和
          //0 NaN null ""空字符串 undefined
        //====验证是否存在 或者 经过Object.prototype.toString.call()方法 检测连个对象都不是 直接返回false
        if (!obj || Object.prototype.toString.call(obj) !== "[object Object]") return false;
        proto = Object.getPrototypeOf(obj);
        if (!proto) return true; //空原型指向的对象 例如:let a=Object.create(null) a.__proto__ 为undefined
        Ctor = proto.hasOwnProperty('constructor') && proto.constructor;
        // 检测是Object是否为普通的对象实例
        return typeof Ctor === "function" && Ctor === Object;
    };
    
    // 在发送请求的时候,如果我们设置的URL没有前缀部分,则Axios内部帮助我们把baseURL拼上去
    //    +例如:axios.get('/user/list') ->真实项目地址:http://127.0.0.1:9999/user/list
    //    +但凡自己写的url有前缀,baseURL就没用了[内部就有判断]
    axios.defaults.baseURL='http://127.0.0.1:9999';
    // 允许携带跨域资源凭证
    axios.defaults.withCredentials = true;
    // 针对POST系列请求,如果DATA是个纯粹的对象,则需要变为URLENCODED格式
    axios.defaults.transformRequest=data=>{
        if(isPlainObject(data)) data=Qs.stringify(data);
        return data;
    };
    
    // 请求拦截器:发生在请求发送之前的“最后一步” config是Axios内部已经处理好的配置信息,但是我们可以再次去给配置信息进行一些处理,最后自己返回的配置信息,就是发送请求时候的最终配置信息
    axios.interceptors.request.use(config => {
        return config;
    });
    
    // 响应拦截器:发生在服务器返回结果(成功/失败) 和自己调用.then中间
    axios.interceptors.response.use(response=>{
        // 请求成功,只返回响应主体信息
        return response.data;
    },reson=>{
        // 请求失败,一般做统一提示
        // 失败原因 有三种
        if(reson && reson.response){
            //@1 服务器有响应信息,只不过状态码不是2开始的
            let response=reson.response;
            switch(response.status){
                case 400:
                    // 
                    break;
            }
        }else{
            // Axios内部返回的信息
            if(reson&&reson.code==='ECONNABORTED'){
                //@2 请求被中断或者超时了
    
            }       
            if(!navigator.onLine){
                // @3断网了
            }
        }
        return Promise.reject(reson);
    });
    

    image.png