二次分装 Axios
1. 对 GET 请求
- 验证 URL 的最后一个字符是不是 & 符号,是的话去除
- 将 params 传过来的对象 与 路径上的参数 合并 并 去重
2. 全局配置 Axios
- 配置超时时间
axios.defaults.timeout = 30000
- 对请求 request 进行拦截器拦截 (给响应头部 添加 X-Authorization)
axios.interceptors.response.use(config => {
if (this.token.getToken()) {
config.headers['X-Authorization'] = this.auth(config.method, config.url);
}
const tenant = this.token.getCurTenant();
if (tenant && tenant.tenantId) config.headers['X-Tenant'] = tenant.tenantId;
return config
},err=>{
})
- 对响应 response 进行拦截器拦截
-
- 成功 响应: 判断 token是否快过期(5min)是的话则主动刷新 tiken
-
const MAX_REFRESH = 3;
axiosProxy.proxy().interceptors.response.use(
res => {
this.token.storeToken(res);
this.token.storeMackey(res);
const expTime = this.token.getExp();
if (expTime && ((expTime - (new Date).getTime()) <= (60 * 1 * 1000 * 5))) this.api.refreshToken();
return Promise.resolve(res);
},
err => {
console.log('err: ', err);
const errData = err.response;
if (errData.status === 401) {
switch (errData.data.code) {
case 40100:
refreshCount++;
if (refreshCount > MAX_REFRESH) {
this.api.logout();
return Promise.reject(err)
}
return new Promise((r, j) => {
this.api.request(errData.config).then(res => { r(res) }).catch(err => { j(err) })
})
break;
case 40101:
this.api.logout();
break;
}
}
if (typeof context.httpResponseErr === 'function') context.httpResponseErr(err);
return Promise.reject(err)
}
)