二次分装 Axios

98 阅读1分钟

二次分装 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();
	// 如果cookie里有租户信息说明已经确定了租户,就携带上租户ID
	if (tenant && tenant.tenantId) config.headers['X-Tenant'] = tenant.tenantId;
	return config
	},err=>{

})
  • 对响应 response 进行拦截器拦截
    • 成功 响应: 判断 token是否快过期(5min)是的话则主动刷新 tiken
    • 失败 响应:鉴权过期3次则登出
const MAX_REFRESH = 3;
axiosProxy.proxy().interceptors.response.use(
		res => {
			this.token.storeToken(res);
			this.token.storeMackey(res);
			const expTime = this.token.getExp();
			// token过期前5分钟主动刷新token
			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)
		}
	)