request.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import axios, { AxiosError } from "axios";
  2. import { message } from "ant-design-vue";
  3. import { loadProgressBar } from "axios-progress-bar";
  4. import { signToken } from "@/plugins/signToken";
  5. import { filterConfigEmpty } from "@/plugins/configFilter";
  6. import { downloadBlob, exitLogin } from "@/utils/common";
  7. const request = axios.create({
  8. baseURL: import.meta.env.VITE_APP_API_HOST,
  9. withCredentials: true,
  10. timeout: 180000,
  11. method: "post",
  12. transformRequest: [],
  13. });
  14. request.interceptors.request.use(
  15. (config) => {
  16. if (!config.url) {
  17. throw new AxiosError(
  18. "request must should a url parameter",
  19. "REQUEST_PARAMETER_ERROR",
  20. config
  21. );
  22. }
  23. config.headers = config.headers || {};
  24. if (!config.noAuth) {
  25. const { token, timestamp } = signToken(config.url, config.method);
  26. config.headers["Authorization"] = token;
  27. config.headers["time"] = timestamp;
  28. }
  29. config.headers["Content-Type"] =
  30. config.headers["Content-Type"] || "application/x-www-form-urlencoded";
  31. if (!config.headers["Content-Type"]?.toString().includes("multipart")) {
  32. config.transformRequest = (d) => new URLSearchParams(d);
  33. }
  34. if (config.download) {
  35. config.responseType = config.responseType || "blob";
  36. }
  37. filterConfigEmpty(config);
  38. return config;
  39. },
  40. (error: AxiosError) => {
  41. if (!error.config.noToast) {
  42. message.error(error.message || error.name || error.code);
  43. }
  44. return Promise.reject(error);
  45. }
  46. );
  47. request.interceptors.response.use(
  48. (response) => {
  49. if (response.config.download) {
  50. downloadBlob(response);
  51. return response;
  52. }
  53. if (response.data.hasError) {
  54. const errMsg = response.data?.errMsg?.join("\n");
  55. message.error(errMsg);
  56. return Promise.reject(response.data);
  57. }
  58. return response.data;
  59. },
  60. async (error: AxiosError<any>) => {
  61. if (error.isAxiosError && !error.config.noToast) {
  62. if (
  63. error.response &&
  64. ([401, 403].includes(error.response.status) ||
  65. error.response.data?.code?.toString()?.startsWith("401"))
  66. ) {
  67. exitLogin(false);
  68. message.error({ content: "登录状态已过期", key: "token-valid" });
  69. return Promise.reject(error);
  70. }
  71. let msg = "";
  72. if (error.config?.responseType === "blob") {
  73. try {
  74. const e = JSON.parse(await error?.response?.data?.text());
  75. msg = e.message || e.error || e;
  76. } catch (error) {
  77. console.error(error);
  78. }
  79. }
  80. if (!msg) {
  81. msg =
  82. error?.response?.data?.message ||
  83. error.message ||
  84. error.name ||
  85. error.code;
  86. }
  87. message.error(msg);
  88. } else if (!error.isAxiosError) {
  89. error.message && message.error(error.message);
  90. }
  91. return Promise.reject(error);
  92. }
  93. );
  94. loadProgressBar(null, request);
  95. export default request;