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