/* * @Author: 赵伟 * @Date: 2024-03-25 13:52:54 * @Description: 网络请求配置,详情请参考 https://umijs.org/docs/max/request */ import type { AxiosError, AxiosRequestConfig, AxiosResponse, RequestConfig, RequestError, RequestOptions, } from '@umijs/max'; import { message } from 'antd'; import { clearSessionToken, getAccessToken } from './access'; import { setRemoteMenu } from './services/session'; import Loading from './utils/loading'; import { gotoLoginPage } from './utils/ui'; // [antd: Notification] You are calling notice in render which will break in React 18 concurrent mode. Please trigger in effect instead. const popupError = (error: string, skipErrorHandler: boolean | undefined = false) => { if (!skipErrorHandler) { // 直接调用 message.error 有时候不弹出来 setTimeout(() => { message.error(error); }, 100); } }; /** * Umi Max 网络请求配置 * @doc https://umijs.org/docs/max/request#配置 */ export const requestConfig: RequestConfig = { timeout: 120 * 1000, requestInterceptors: [ (url: string, options: AxiosRequestConfig) => { const headers = options.headers ?? {}; const authHeader = headers['Authorization']; const isToken = headers['isToken']; const skipLoading = (options as RequestOptions)?.skipLoading; if (!authHeader && isToken !== false) { const accessToken = getAccessToken(); if (accessToken) { headers['Authorization'] = `Bearer ${accessToken}`; } } if (!skipLoading) { Loading.show(); } return { url, options }; }, ], responseInterceptors: [ [ async (response: AxiosResponse) => { const { status, data, config } = response || {}; const options = config as RequestOptions; const skipErrorHandler = options?.skipErrorHandler; const skipLoading = options?.skipLoading; const skipValidating = options?.skipValidating; if (!skipLoading) { Loading.hide(); } if (status >= 200 && status < 300) { // 无内容或者无需验证 if (status === 204 || skipValidating) { return response; } if (data && data.code === 200) { return response; } // Blob 数据 if (data && data instanceof Blob && data.size > 0) { // 下载文件失败时,返回的是 JSON 数据,格式为:{code: 500, msg: "xxx"} if (data.type === 'application/json') { try { const text = await data.text(); const json = JSON.parse(text); if (json.code === 500) { popupError(json.msg || '请求失败', skipErrorHandler); return Promise.reject(json); } } catch (error) { console.error('JSON 解析失败', error); } } return response; } // Token 失效 if (data && data.code === 401) { clearSessionToken(); setRemoteMenu(null); gotoLoginPage(false); popupError('请重新登录'); return Promise.reject(response); } popupError(data?.msg ?? '请求失败', skipErrorHandler); return Promise.reject(response); } else { popupError('请求失败', skipErrorHandler); return Promise.reject(response); } }, (error: RequestError) => { const options = (error as AxiosError).config as RequestOptions; const skipErrorHandler = options?.skipErrorHandler; const skipLoading = options?.skipLoading; if (!skipLoading) { Loading.hide(); } popupError(error.message ?? '请求失败', skipErrorHandler); return Promise.reject(error); }, ], ], };