request.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import axios from 'axios';
  2. import Vue from 'vue';
  3. const ignoreResponseTransformMatch = [
  4. '/pre_interface/V5.0/insertBasicInfo',
  5. '/pre_interface/V5.0/getPreItem',
  6. '/pre_interface/V5.0/setStatus',
  7. '/captchaImage',
  8. ];
  9. const magicCode = [-5, -9, -8];
  10. const shareRequest = new Map();
  11. const http = axios.create({
  12. baseURL: process.env.VUE_APP_BASE_API,
  13. withCredentials: true,
  14. timeout: 60 * 1000,
  15. });
  16. http.interceptors.request.use(config => {
  17. const token = localStorage.getItem('token');
  18. if (token) config.headers.Authorization = token;
  19. if (config['meta'] && config['meta'].share && !config.signal) {
  20. const key = config.url;
  21. let controller = shareRequest.get(key);
  22. if (controller) controller.abort();
  23. shareRequest.set(key, controller = new AbortController());
  24. config.signal = controller.signal;
  25. }
  26. return config;
  27. });
  28. http.interceptors.response.use(
  29. response => {
  30. const res = response.data;
  31. // 设置 cookie
  32. if (response.headers['access-control-expose-headers']) {
  33. const cookie = response.headers['access-control-expose-headers'].split(';')[0];
  34. if (cookie) document.cookie = cookie;
  35. }
  36. // 直接返回响应数据
  37. try {
  38. const {url, meta = {}} = response.config;
  39. if (meta.share && shareRequest.has(url)) shareRequest.delete(url);
  40. if (ignoreResponseTransformMatch.includes(url) || meta.ignoreResponseTransform) return res;
  41. } catch (e) {}
  42. const {
  43. ResultCode = 0, ResultInfo, Data,
  44. code = ResultCode, message = ResultInfo, data = Data,
  45. } = res;
  46. if (code === 0) return {code, data, message};
  47. try {
  48. if (magicCode.includes(code)) {
  49. Vue.prototype.$router1.replace('/');
  50. throw message;
  51. } else if (code === 401) {
  52. const isAllow = sessionStorage.getItem('isAllow') || 'true';
  53. if (isAllow) Vue.prototype.$router1.replace('/');
  54. throw `登录过期,请重新登录`;
  55. } else {
  56. throw message || `错误,请重试!`;
  57. }
  58. } catch (error) {
  59. Vue.prototype.$message({
  60. message: error,
  61. type: 'error',
  62. showClose: true,
  63. });
  64. }
  65. return Promise.reject(new Error(message || `错误,请重试!`));
  66. },
  67. error => {
  68. if (error.message !== 'canceled') Vue.prototype.$message({
  69. message: error.message,
  70. type: 'error',
  71. });
  72. return Promise.reject(error);
  73. },
  74. );
  75. export default http;