index.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import axios from 'axios';
  2. import {Base64} from 'js-base64';
  3. import website from '~src/config';
  4. import router from '~src/router/index';
  5. import {getToken} from '~src/api/util/auth';
  6. import {toSerialize} from "vue-utils-plus"
  7. //默认超时时间
  8. axios.defaults.timeout = 20000;
  9. //返回其他状态码
  10. axios.defaults.validateStatus = function (status) {
  11. return status >= 200 && status <= 500;
  12. };
  13. //跨域请求,允许保存cookie
  14. axios.defaults.withCredentials = true;
  15. //http request拦截
  16. axios.interceptors.request.use(config => {
  17. const meta = (config['meta'] || {});
  18. const isToken = meta['isToken'] === false;
  19. config.headers['Authorization'] = `Basic ${Base64.encode(`${website.clientId}:${website.clientSecret}`)}`;
  20. //让每个请求携带token
  21. const token = getToken()
  22. if (token && !isToken) {
  23. config.headers[website.tokenHeader] = 'bearer ' + token
  24. }
  25. //headers中配置text请求
  26. if (config['text'] === true) {
  27. config.headers["Content-Type"] = "text/plain";
  28. }
  29. //headers中配置serialize为true开启序列化
  30. if (config.method === 'post' && meta['isSerialize'] === true) {
  31. config.data = toSerialize(config.data);
  32. }
  33. return config
  34. }, error => {
  35. return Promise.reject(error)
  36. });
  37. //http response 拦截
  38. axios.interceptors.response.use(res => {
  39. //获取状态码
  40. const status = res.data?.code || res.status;
  41. const message = res.data?.msg || res.data['error_description'] || '未知错误';
  42. //如果是401则跳转到登录页面
  43. if (status === 401) {
  44. window.$message?.error(message || '身份失效!');
  45. router.push({path: '/login'})
  46. }
  47. // 如果请求为非200, 自行catch逻辑处理
  48. if (status !== 200) {
  49. return Promise.reject(res);
  50. }
  51. return res;
  52. }, error => {
  53. window.$message?.error('请求异常!');
  54. return Promise.reject(new Error(error));
  55. });
  56. export default axios;