http.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import { MessagePlugin } from "tdesign-vue-next";
  2. import axios from "axios";
  3. import { getCookie } from "@/services/cookie";
  4. import router from "./router";
  5. // axios 配置
  6. axios.defaults.timeout = 60000;
  7. axios.defaults.withCredentials = false;
  8. const requestDebounceMap = new Map();
  9. const requestThrottleSet = new Set();
  10. // http request 拦截器
  11. axios.interceptors.request.use(
  12. (config: any) => {
  13. if (!config.url.startsWith("/png")) {
  14. config.baseURL = "/api";
  15. }
  16. config.headers.Authorization =
  17. "Bearer " + (localStorage.token || getCookie("token") || "");
  18. if (config.params) {
  19. // 防抖, 比如输入搜索
  20. if (config.params.debounce > 0) {
  21. const url = config.method + config.url;
  22. const cache: any = requestDebounceMap.get(url);
  23. if (cache) {
  24. clearTimeout(cache.timer);
  25. cache.reject();
  26. }
  27. delete config.params.debounce;
  28. delete config.params.throttle;
  29. return new Promise((resolve, reject) => {
  30. const newCache: any = { reject };
  31. newCache.timer = setTimeout(() => {
  32. requestDebounceMap.delete(url);
  33. resolve(config);
  34. }, config.params.debounce);
  35. requestDebounceMap.set(url, newCache);
  36. });
  37. }
  38. // 节流,避免短时间重复请求,比如点击确定
  39. else if (config.params.throttle > 0) {
  40. const url = config.method + config.url;
  41. // 已经存在,取消重复请求
  42. if (requestThrottleSet.has(url)) {
  43. return Promise.reject("Repeated request.");
  44. }
  45. requestThrottleSet.add(url);
  46. setTimeout(() => {
  47. requestThrottleSet.delete(url);
  48. }, config.params.throttle);
  49. }
  50. delete config.params.debounce;
  51. delete config.params.throttle;
  52. }
  53. return config;
  54. },
  55. (err: any) => Promise.reject(err)
  56. );
  57. // http response 拦截器
  58. axios.interceptors.response.use(
  59. (response: any) => {
  60. if (response && response.data && response.data.error) {
  61. MessagePlugin.error(response.data.error);
  62. return;
  63. }
  64. if (response) {
  65. return response.data;
  66. }
  67. return;
  68. },
  69. (error: any) => {
  70. if (error && !error.response) {
  71. return;
  72. }
  73. if (error && error.response) {
  74. if (error.response.config.url === "/account/profile") {
  75. return;
  76. }
  77. if (
  78. error.response.status !== 401 &&
  79. error.response &&
  80. error.response.data &&
  81. error.response.data.error
  82. ) {
  83. MessagePlugin.error(error.response.data.error);
  84. return;
  85. }
  86. switch (error.response.status) {
  87. case 401:
  88. sessionStorage.setItem("cb", encodeURIComponent(location.href));
  89. router.replace({ path: "/login" });
  90. break;
  91. case 403:
  92. MessagePlugin.error("请求错误,不合法的请求!");
  93. break;
  94. case 404:
  95. if (error.response.config.url.indexOf("/data/") !== 0) {
  96. MessagePlugin.error("访问数据不存在,请检查后重试!");
  97. }
  98. break;
  99. case 500:
  100. MessagePlugin.error("请求服务错误,请稍后重试!");
  101. break;
  102. case 504:
  103. MessagePlugin.error("网络超时,请检测你的网络!");
  104. break;
  105. default:
  106. MessagePlugin.error("未知网络错误!");
  107. break;
  108. }
  109. }
  110. // return error.response ? error.response.data : error;
  111. }
  112. );
  113. export default axios;