http.ts 3.4 KB

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