You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

requestConfig.ts 3.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*
  2. * @Author: 赵伟
  3. * @Date: 2024-03-25 13:52:54
  4. * @Description: 网络请求配置,详情请参考 https://umijs.org/docs/max/request
  5. */
  6. import type {
  7. AxiosError,
  8. AxiosRequestConfig,
  9. AxiosResponse,
  10. RequestConfig,
  11. RequestError,
  12. RequestOptions,
  13. } from '@umijs/max';
  14. import { message } from 'antd';
  15. import { clearSessionToken, getAccessToken } from './access';
  16. import { setRemoteMenu } from './services/session';
  17. import Loading from './utils/loading';
  18. import { gotoLoginPage } from './utils/ui';
  19. // [antd: Notification] You are calling notice in render which will break in React 18 concurrent mode. Please trigger in effect instead.
  20. const popupError = (error: string, skipErrorHandler: boolean | undefined = false) => {
  21. if (!skipErrorHandler) {
  22. // 直接调用 message.error 有时候不弹出来
  23. setTimeout(() => {
  24. message.error(error);
  25. }, 100);
  26. }
  27. };
  28. /**
  29. * Umi Max 网络请求配置
  30. * @doc https://umijs.org/docs/max/request#配置
  31. */
  32. export const requestConfig: RequestConfig = {
  33. timeout: 120 * 1000,
  34. requestInterceptors: [
  35. (url: string, options: AxiosRequestConfig) => {
  36. const headers = options.headers ?? {};
  37. const authHeader = headers['Authorization'];
  38. const isToken = headers['isToken'];
  39. const skipLoading = (options as RequestOptions)?.skipLoading;
  40. if (!authHeader && isToken !== false) {
  41. const accessToken = getAccessToken();
  42. if (accessToken) {
  43. headers['Authorization'] = `Bearer ${accessToken}`;
  44. }
  45. }
  46. if (!skipLoading) {
  47. Loading.show();
  48. }
  49. return { url, options };
  50. },
  51. ],
  52. responseInterceptors: [
  53. [
  54. async (response: AxiosResponse) => {
  55. const { status, data, config } = response || {};
  56. const options = config as RequestOptions;
  57. const skipErrorHandler = options?.skipErrorHandler;
  58. const skipLoading = options?.skipLoading;
  59. const skipValidating = options?.skipValidating;
  60. if (!skipLoading) {
  61. Loading.hide();
  62. }
  63. if (status >= 200 && status < 300) {
  64. // 无内容或者无需验证
  65. if (status === 204 || skipValidating) {
  66. return response;
  67. }
  68. if (data && data.code === 200) {
  69. return response;
  70. }
  71. // Blob 数据
  72. if (data && data instanceof Blob && data.size > 0) {
  73. // 下载文件失败时,返回的是 JSON 数据,格式为:{code: 500, msg: "xxx"}
  74. if (data.type === 'application/json') {
  75. try {
  76. const text = await data.text();
  77. const json = JSON.parse(text);
  78. if (json.code === 500) {
  79. popupError(json.msg || '请求失败', skipErrorHandler);
  80. return Promise.reject(json);
  81. }
  82. } catch (error) {
  83. console.error('JSON 解析失败', error);
  84. }
  85. }
  86. return response;
  87. }
  88. // Token 失效
  89. if (data && data.code === 401) {
  90. clearSessionToken();
  91. setRemoteMenu(null);
  92. gotoLoginPage(false);
  93. popupError('请重新登录');
  94. return Promise.reject(response);
  95. }
  96. popupError(data?.msg ?? '请求失败', skipErrorHandler);
  97. return Promise.reject(response);
  98. } else {
  99. popupError('请求失败', skipErrorHandler);
  100. return Promise.reject(response);
  101. }
  102. },
  103. (error: RequestError) => {
  104. const options = (error as AxiosError).config as RequestOptions;
  105. const skipErrorHandler = options?.skipErrorHandler;
  106. const skipLoading = options?.skipLoading;
  107. if (!skipLoading) {
  108. Loading.hide();
  109. }
  110. popupError(error.message ?? '请求失败', skipErrorHandler);
  111. return Promise.reject(error);
  112. },
  113. ],
  114. ],
  115. };