request.js 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import { request } from 'umi';
  2. import { downloadBlob } from './download';
  3. /**
  4. *
  5. * 自定义修改 umi-request 行为
  6. *
  7. * 默认错误处理行为是通过 message 组件报错
  8. * 也可以设置 option.showType 来修改默认行为
  9. *
  10. * export enum ErrorShowType {
  11. * SILENT = 0, // 不提示错误
  12. * WARN_MESSAGE = 1, // 警告信息提示
  13. * ERROR_MESSAGE = 2, // 错误信息提示
  14. * NOTIFICATION = 4, // 通知提示
  15. * REDIRECT = 9, // 页面跳转,会跳转到 /exception 页面
  16. * }
  17. *
  18. */
  19. function requestInterceptor(url, options) {
  20. const headers = options.headers || {};
  21. const token = localStorage.getItem('token')
  22. ? { Authorization: localStorage.getItem('token') }
  23. : {};
  24. console.log('------------->', API_BASE);
  25. const prefix = `${API_BASE}/api/admin`;
  26. let requestType = 'json';
  27. if (options.data instanceof FormData) {
  28. requestType = 'form';
  29. }
  30. return {
  31. url: `${prefix}${url}`,
  32. options: {
  33. ...options,
  34. requestType,
  35. headers: {
  36. ...headers,
  37. ...token,
  38. },
  39. },
  40. };
  41. }
  42. async function responseInterceptor(response, ctx) {
  43. const contextType = response.headers.get('content-type');
  44. if (contextType.indexOf('json') > -1) {
  45. const result = await response.clone().json();
  46. if (result?.token || result?.data?.token) {
  47. localStorage.setItem('token', result?.token || result?.data?.token);
  48. }
  49. }
  50. if (contextType.indexOf('application/vnd.ms-excel') > -1) {
  51. const data = await response.clone().blob();
  52. console.info(response);
  53. const content = response.headers.get('content-disposition');
  54. const fileName = content.replace('attachment;filename=', '');
  55. downloadBlob(data, decodeURIComponent(fileName));
  56. }
  57. return response;
  58. }
  59. // https://umijs.org/plugins/plugin-request
  60. export const requestConfig = {
  61. errorConfig: {
  62. adaptor: (resData, ctx) => {
  63. if (typeof resData === 'string') {
  64. // 可能是 excel 导出
  65. return {
  66. success: true,
  67. };
  68. }
  69. const showError = ctx.req.options?.showType;
  70. return {
  71. ...resData,
  72. success: resData.code === 1000,
  73. errorMessage: resData.message,
  74. showType: isNaN(showError) ? 1 : showError, // 默认通过 message 组件报错
  75. };
  76. },
  77. },
  78. requestInterceptors: [requestInterceptor],
  79. responseInterceptors: [responseInterceptor],
  80. };
  81. export default (...args) => {
  82. return request(...args).then((r) => (args[1]?.download ? r: r.data ));
  83. };
  84. export function queryTable(apiRequest) {
  85. return function (params) {
  86. const { current, pageSize, ...leftParams } = params;
  87. return apiRequest({
  88. ...params,
  89. pageNum: params.current,
  90. ...(leftParams || {}),
  91. })
  92. .then((res) => {
  93. return {
  94. data: res.records,
  95. success: true,
  96. total: res.total,
  97. };
  98. })
  99. .catch((err) => {
  100. return {
  101. success: false,
  102. };
  103. });
  104. };
  105. }