request.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /**** request.js ****/
  2. // 导入axios
  3. import axios from 'axios'
  4. // 使用element-ui message做消息提醒
  5. import { Message,Loading } from 'element-ui';
  6. import router from '../router'
  7. import store from "../store/index"
  8. import Nprogress from 'nprogress'
  9. import 'nprogress/nprogress.css'
  10. // 根据浏览器地址动态获取接口地址
  11. function GET_API_URL () {
  12. var str = window.location.href;
  13. var index = str.indexOf('/');
  14. var num = 0;
  15. while(index !== -1) {
  16. num++;
  17. index = str.indexOf('/',index + 1);
  18. if (num++ === 3) {
  19. return str.slice(0, index);
  20. }
  21. }
  22. }
  23. let CancelToken = axios.CancelToken;
  24. let source = CancelToken.source();
  25. //1. 创建新的axios实例,
  26. const service = axios.create({
  27. // 公共接口--这里注意后面会讲
  28. baseURL:process.env.NODE_ENV === 'production' ? GET_API_URL():'/apis',
  29. // 超时时间 单位是ms,这里设置了3s的超时时间
  30. timeout: 60 * 1000
  31. })
  32. let loadingInstance = ''
  33. // 2.请求拦截器
  34. service.interceptors.request.use(config => {
  35. Nprogress.start()
  36. store.state.loading = true //在请求发出之前进行一些操作
  37. config.data['languagecode'] = localStorage.getItem('lang') ? localStorage.getItem('lang') : 'ZH'
  38. const token = sessionStorage.getItem('active_account')?JSON.parse(sessionStorage.getItem('active_account')).token:'' //这里取token之前,你肯定需要先拿到token,存一下
  39. const appid = sessionStorage.getItem('activeApp')?JSON.parse(sessionStorage.getItem('activeApp')).systemappid:''
  40. //发请求前做的一些处理,数据转化,配置请求头,设置token,设置loading等,根据需求去添加
  41. config.data['accesstoken'] = token
  42. config.data['systemappid'] = appid
  43. config.data = JSON.stringify(config.data); //数据转化,也可以使用qs转换
  44. if (!config.headers) {
  45. config.headers = {}
  46. }
  47. if (!config.headers['Content-Type']) {
  48. config
  49. .headers['Content-Type'] = 'application/json;charset=UTF-8';
  50. }
  51. //注意使用token的时候需要引入cookie方法或者用本地localStorage等方法,推荐js-cookie
  52. return config
  53. }, error => {
  54. Promise.reject(error)
  55. })
  56. // 3.响应拦截器
  57. service.interceptors.response.use(response => {
  58. Nprogress.done()
  59. //接收到响应数据并成功后的一些共有的处理,关闭loading等
  60. setTimeout(() => {
  61. store.state.loading = false
  62. }, 500);
  63. //在这里对返回的数据进行处理
  64. if (response.data.code === -1) {
  65. router.push({path:'/'})
  66. // location.reload(true);
  67. store.state.closeDrawerTemp = false
  68. }
  69. return response.data;
  70. }, error => {
  71. console.log(error)
  72. /***** 接收到异常响应的处理开始 *****/
  73. if (error && error.response) {
  74. // 1.公共错误处理
  75. // 2.根据响应码具体处理
  76. switch (error.response.status) {
  77. case 400:
  78. error.message = '错误请求'
  79. break;
  80. case 401:
  81. error.message = '未授权,请重新登录'
  82. break;
  83. case 403:
  84. error.message = '拒绝访问'
  85. break;
  86. case 404:
  87. error.message = '请求错误,未找到该资源'
  88. break;
  89. case 405:
  90. error.message = '请求方法未允许'
  91. break;
  92. case 408:
  93. error.message = '请求超时'
  94. break;
  95. case 500:
  96. error.message = '服务器端出错'
  97. break;
  98. case 501:
  99. error.message = '网络未实现'
  100. break;
  101. case 502:
  102. error.message = '网络错误'
  103. break;
  104. case 503:
  105. error.message = '服务不可用'
  106. break;
  107. case 504:
  108. error.message = '网络超时'
  109. break;
  110. case 505:
  111. error.message = 'http版本不支持该请求'
  112. break;
  113. case '(已取消)':
  114. error.message = '当前网络繁忙,请稍后重新登录'
  115. break;
  116. default:
  117. error.message = `连接错误${error.response.status}`
  118. }
  119. } else {
  120. // 超时处理
  121. if (JSON.stringify(error).includes('timeout')) {
  122. Message.error('服务器响应超时,请刷新当前页')
  123. }
  124. source.cancel('停止请求');
  125. }
  126. if (error.message === 'timeout of 20000ms exceeded'){
  127. Message.error('当前网络繁忙,请稍后重新登录')
  128. }else {
  129. console.log(error.message,'error.message')
  130. Message.error(error.message)
  131. }
  132. /***** 处理结束 *****/
  133. //如果不需要错误处理,以上的处理过程都可省略
  134. console.log(error.response,'error.response')
  135. return Promise.resolve(error.response)
  136. })
  137. //4.导入文件
  138. export default service