request.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. // @flow
  2. /**
  3. * @name utils/request.js
  4. * @fileOverview 封装异步请求调用
  5. * @author liyi
  6. */
  7. import axios from 'axios';
  8. import _ from 'lodash';
  9. import NProgress from 'nprogress';
  10. import 'nprogress/nprogress.css';
  11. //import { updateExpiredTime } from 'utils/authPermit';
  12. NProgress.configure({
  13. showSpinner: true,
  14. easing: 'ease',
  15. speed: 500,
  16. });
  17. /**
  18. * 检测请求响应状态码,检测请求结果状态,错误时抛出异常
  19. * @param {*} response
  20. */
  21. /* eslint-disable prefer-promise-reject-errors */
  22. function handleResponse(response) {
  23. NProgress.done();
  24. if (response && response.status >= 200 && response.status < 300) {
  25. const { data: result } = response;
  26. if (
  27. (result.code && result.code > 0) ||
  28. result.success === true ||
  29. result.code === '1' ||
  30. typeof result.code === 'string'
  31. ) {
  32. const authorization = response.headers.authorization || response.headers.Authorization;
  33. if (authorization) {
  34. localStorage.setItem('AI.token', authorization);
  35. }
  36. return Promise.resolve({
  37. code: result.code,
  38. message: result.message,
  39. data: _.get(result, 'data', result.value || ''),
  40. pagination: result.pagination,
  41. });
  42. }
  43. if ((result.code && result.code < 0) || result.success === false) {
  44. return Promise.reject({
  45. code: result.code,
  46. message: result.message,
  47. error: result.error || result.errors || '',
  48. });
  49. }
  50. return Promise.resolve({
  51. data: _.get(result, 'data', result.value) || response.data,
  52. });
  53. }
  54. return Promise.reject({
  55. code: _.get(response || {}, 'status', -1),
  56. message: _.get(response || {}, 'statusText', '请求异常'),
  57. error: _.get(response || {}, 'statusText', '请求异常'),
  58. data: _.get(response, 'result.data', {}),
  59. });
  60. }
  61. /* eslint-disable prefer-promise-reject-errors */
  62. function handleError(error) {
  63. NProgress.done();
  64. const { statusText, status } = error.response || {};
  65. let errInfo = _.get(error.response || {}, ['data', 'message']) || error.message || '请求服务出错';
  66. const errCode = _.get(error.response || {}, ['data', 'code']) || error.code || -1;
  67. // 请求资源不存在
  68. if (status === 404) errInfo = `请求的资源[${_.get(error.response, ['config', 'url'])}]不存在!`;
  69. // 请求超时打断
  70. if (errCode === 'ECONNABORTED') {
  71. errInfo = '服务连接失败或请求超时!';
  72. }
  73. return Promise.reject({
  74. code: errCode,
  75. message: errInfo || statusText,
  76. error: errInfo || statusText,
  77. data: _.get(error.response, 'data.data', {}),
  78. });
  79. }
  80. /**
  81. * 创建axios实例,设置默认api请求跟路径、超时时间,请求头content-type
  82. */
  83. const axiosInstance = axios.create({
  84. timeout: 1200000,
  85. headers: {
  86. 'Content-Type': 'application/json;charset=UTF-8',
  87. Accept: 'application/json',
  88. },
  89. });
  90. /**
  91. * axios 拦截
  92. * TODO 通过config为每次api请求调用添加token
  93. */
  94. axiosInstance.interceptors.request.use(
  95. function(config) {
  96. const token = localStorage.getItem('AI.token');
  97. if (token) {
  98. //判断token是否存在
  99. config.headers.Authorization = token; //将token设置成请求头
  100. }
  101. if (config.basePath && config.basePath !== '') {
  102. config.baseURL = 'http://' + config.basePath;
  103. }
  104. //updateExpiredTime();
  105. if (!config.sync) {
  106. NProgress.start();
  107. }
  108. return config;
  109. },
  110. function(error) {
  111. return Promise.reject(error);
  112. }
  113. );
  114. /**
  115. * axios 拦截
  116. */
  117. axiosInstance.interceptors.response.use(response => handleResponse(response), error => handleError(error));
  118. export default axiosInstance;