/* eslint-disable no-console */ import axios, { AxiosRequestConfig } from 'axios'; import { stringify } from 'qs'; // 是否正在刷新token(这里做一个标识,防止重复发出刷新token请求) let isTokenRefreshing = false; let cacheRefreshingRequests: any[] = []; /** * HTTP状态码映射 */ export const HTTP_STATUS_CODE_MAPPING: any = { 200: '服务器成功返回请求的数据。', 201: '新建或修改数据成功。', 202: '一个请求已经进入后台排队(异步任务)。', 204: '删除数据成功。', 400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。', 401: '用户没有权限(令牌、用户名、密码错误)。', 403: '用户得到授权,但是访问是被禁止的。', 404: '发出的请求针对的是不存在的记录,服务器没有进行操作。', 406: '请求的格式不可得。', 410: '请求的资源被永久删除,且不会再得到的。', 422: '当创建一个对象时,发生一个验证错误。', 500: '服务器发生错误,请检查服务器。', 502: '网关错误。', 503: '服务不可用,服务器暂时过载或维护。', 504: '网关超时。', }; const service = axios.create(); service.defaults.timeout=1000 * 6; service.interceptors.request.use( (config) => { const cfg = { ...config }; // cfg.headers.Authorization = storageService.get(EStorage.token); return cfg; }, (error) => { console.log('error :>> ', error); return Promise.reject(error); }, ); service.interceptors.response.use( (response) => { const { config, data } = response; // const { // headers: { getResponse }, // } = config; // if (data?.code !== 200) { // // Toast.fail(data?.msg ?? '请求错误', 2, undefined, false); // // 抛出错误 // const err: any = new Error(''); // err.response = response; // throw err; // } // Toast.hide(); // if (getResponse) { // return response; // } return data; }, (error) => { // Toast.hide(); const { status, statusText, config } = error.response??{status:502,statusText:'网络异常',config:''}; const { url } = config; let errorMsg = statusText; const keys = Object.keys(HTTP_STATUS_CODE_MAPPING); if (keys.indexOf(status.toString()) !== -1) { errorMsg = HTTP_STATUS_CODE_MAPPING[status]; } switch (status) { // 没有令牌 case 401: // 只弹出一次 // if (loginModal) { // loginModal.close(); // } // storageService.remove(EStorage.token); // storageService.remove(EStorage.userInfo); // if (!isTokenRefreshing) { // loginModal = showLoginModal(); // (isTokenRefreshing = true), // setTimeout(() => { // isTokenRefreshing = false; // }, 1000); // } // break; // 402:子应用令牌过期 case 402: // storageService.remove(EStorage.token); // storageService.remove(EStorage.userInfo); // if (!isTokenRefreshing && !url.includes(apiConfig.sso.refreshToken)) { // isTokenRefreshing = true; // refreshTokenQuery().then((refreshSuccess) => { // if (refreshSuccess) { // // 重新发送请求 // cacheRefreshingRequests.forEach((callback) => { // callback(); // }); // } // // 重置标识、清空缓存 // isTokenRefreshing = false; // cacheRefreshingRequests = []; // }); // } // 缓存请求 return new Promise((resolve) => { cacheRefreshingRequests.push(() => resolve(service(url, config))); }); // 406:一码贵州令牌过期 case 406: // storageService.remove(EStorage.token); // storageService.remove(EStorage.userInfo); break; default: break; } // if (status !== 401) { // Toast.fail(errorMsg, 2, undefined, false); // } return Promise.reject(error); }, ); interface EnhanceAxiosRequestConfig extends AxiosRequestConfig { headers?: { // 是否需要返回完整的Response数据,默认false getResponse?: boolean; 'Content-Type'?: string; [key: string]: any; }; } function sendParams(method: 'get' | 'delete') { return ( url: string, params: Record = {}, config: EnhanceAxiosRequestConfig = {}, ) => { // Toast.loading('正在请求,请稍等...', 0); return service[method](url, { ...config, params, }); }; } function sendData(method: 'post' | 'put' | 'patch') { return (url: string, data: Record = {}, config: EnhanceAxiosRequestConfig = {}) => { // Toast.loading('正在请求,请稍等...', 0); let oriData = data; if (config.headers?.['Content-Type'] === 'application/x-www-form-urlencoded') { oriData = stringify(oriData, { arrayFormat: 'indices' }); } return service[method](url, oriData, config); }; } export default { service, get: sendParams('get'), delete: sendParams('delete'), post: sendData('post'), put: sendData('put'), patch: sendData('patch'), };