axios 参考文档 https://www.kancloud.cn/yunye/axios/234845
拦截器
在请求或响应被 then 或 catch 处理前拦截它们。
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
// 在发送请求之前做些什么
return config;
}, function (error) {
// 对请求错误做些什么
return Promise.reject(error);
});
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
// 对响应数据做点什么
return response;
}, function (error) {
// 对响应错误做点什么
return Promise.reject(error);
});
在vue项目中的使用
//请求拦截器
axios.interceptors.request.use(config => {
let method = config.method.toLocaleLowerCase();
if (method === 'post') {
config.data = processParam(config.data) || {};
user && user.token && (config.data['token'] = user.token);
return config;
}
if (method === 'get') {
config.params = config.params || {};
user && user.token && (config.params['token'] = user.token);
return config;
}
return config;
},
error => {
return Promise.reject(error);
}
);
//响应拦截器
axios.interceptors.response.use(response => {
if (CONSTANT.HTTP_STATUS.VALID_TOKEN.CODE === response.data.code) {
Storage.removeAll(true);
Storage.remove(Storage.KEYS.USERS, false);
Storage.removeCookie(Storage.KEYS.TOKEN);
router.replace({ name: 'iop.login', query: { redirect: router.currentRoute.fullPath } });
//判断 登录状态是否失效, 已失效 重定向,return掉。
response.data.message = CONSTANT.HTTP_STATUS.VALID_TOKEN.MSG;
}
return response.data;
},
error => {
// return Promise.reject(error)
let config = error.config;
if (!config || !config.retry) return Promise.reject(error);
config.__retryCount = config.__retryCount || 0;
if (config.__retryCount >= config.retry) {
return Promise.reject(error);
}
config.__retryCount += 1;
let backoff = new Promise(function (resolve) {
setTimeout(function () {
resolve();
}, config.retryDelay || 1);
});
return backoff.then(function () {
return axios(config);
});
}
);