request.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import router from '@/router'
  2. import axios from 'axios'
  3. import { Message } from 'element-ui'
  4. import Cookies from 'js-cookie'
  5. import tool from './tool'
  6. import usersInfo from './usersInfo'
  7. // create an axios instance
  8. const service = axios.create({
  9. baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  10. // withCredentials: true, // send cookies when cross-domain requests
  11. timeout: 12000 // request timeout
  12. })
  13. // request interceptor
  14. service.interceptors.request.use(
  15. config => {
  16. // do something before request is sent
  17. // if (store.getters.token) {
  18. // // let each request carry token
  19. // // ['X-Token'] is a custom headers key
  20. // // please modify it according to the actual situation
  21. // config.headers['X-Token'] = getToken()
  22. // }
  23. if (usersInfo.accessToken()) {
  24. config.headers['Authorization'] = process.env.VUE_APP_ACCESS_TOKEN_PREFIX + usersInfo.accessToken()
  25. }
  26. // 设置语言
  27. config.headers['language'] = Cookies.get('language')
  28. if (usersInfo.accessToken() && usersInfo.accessTokenExpiresIn() &&
  29. parseInt(usersInfo.accessTokenExpiresIn()) + parseInt(usersInfo.accessTokenUpdateAt()) - 30 > parseInt(tool.getTimestamp())) {
  30. } else if (usersInfo.accessToken()) {
  31. // 需要先刷新token
  32. const refreshToken = usersInfo.refreshToken()
  33. const refreshTokenExpiresIn = usersInfo.refreshTokenExpiresIn()
  34. const refreshTokenUpdateAt = usersInfo.refreshTokenUpdateAt()
  35. if (refreshToken && refreshTokenExpiresIn &&
  36. parseInt(refreshTokenExpiresIn) - 30 + parseInt(refreshTokenUpdateAt) > parseInt(tool.getTimestamp())) {
  37. // 有效,去更新
  38. axios.get(`${process.env.VUE_APP_BASE_API}/v1/oauth/refresh-token?refresh-token=${refreshToken}`).then(response => {
  39. // 更新本地accessToken
  40. usersInfo.accessToken(response.data.accessToken)
  41. usersInfo.accessTokenExpiresIn(response.data.accessTokenExpiresIn)
  42. usersInfo.accessTokenUpdateAt(response.data.accessTokenUpdateAt)
  43. usersInfo.refreshToken(response.data.refreshToken)
  44. usersInfo.refreshTokenExpiresIn(response.data.refreshTokenExpiresIn)
  45. usersInfo.refreshTokenUpdateAt(response.data.refreshTokenUpdateAt)
  46. usersInfo.accessToken()
  47. }).catch(error => {
  48. Message({
  49. message: 'accessToken Failed',
  50. type: 'error',
  51. duration: 5 * 1000
  52. })
  53. return
  54. })
  55. } else {
  56. // console.log('refreshToken已失效');
  57. usersInfo.clear()
  58. Message({
  59. message: 'refreshToken Invalid',
  60. type: 'error',
  61. duration: 5 * 1000
  62. })
  63. return
  64. }
  65. }
  66. return config
  67. },
  68. error => {
  69. // do something with request error
  70. console.log('请求报错----->', error) // for debug
  71. return Promise.reject(error)
  72. }
  73. )
  74. // response interceptor
  75. service.interceptors.response.use(
  76. response => {
  77. const responseData = response.data
  78. const data = responseData.data
  79. if ((responseData.success === false) || (responseData.code && responseData.code !== 200)) {
  80. // Message({
  81. // message: responseData.message || 'Error',
  82. // type: 'error',
  83. // duration: 5 * 1000
  84. // })
  85. return Promise.reject(responseData.message)
  86. } else {
  87. if (!data) {
  88. return { data: responseData }
  89. }
  90. return data
  91. }
  92. },
  93. err => {
  94. if (err && err.response && err.response.data && err.response.data.message) {
  95. err.message = err.response.data.message
  96. } else if (err && err.response) {
  97. switch (err.response.data.status) {
  98. case 400:
  99. err.message = '请求错误'
  100. break
  101. case 401:
  102. err.message = '未授权,请登录'
  103. break
  104. case 403:
  105. err.message = '拒绝访问'
  106. break
  107. case 404:
  108. err.message = `请求地址出错: ${err.response.data.config.url}`
  109. break
  110. case 408:
  111. err.message = '请求超时'
  112. break
  113. case 500:
  114. err.message = '服务器内部错误'
  115. break
  116. case 501:
  117. err.message = '服务未实现'
  118. break
  119. case 502:
  120. err.message = '网关错误'
  121. break
  122. case 503:
  123. err.message = '服务不可用'
  124. break
  125. case 504:
  126. err.message = '网关超时'
  127. break
  128. case 505:
  129. err.message = 'HTTP版本不受支持'
  130. break
  131. default:
  132. }
  133. }
  134. if (err.response.data.status == 401) {
  135. localStorage.clear()
  136. router.replace({
  137. path: '/login',
  138. query: { redirect: router.currentRoute.fullPath }
  139. })
  140. }
  141. if (err.response.data.status == 403 || err.response.data.status == 400) {
  142. Message({
  143. message: err.message || 'Error',
  144. type: 'error',
  145. duration: 3 * 1000
  146. })
  147. }
  148. // Message({
  149. // message: err.message || 'Error',
  150. // type: 'error',
  151. // duration: 5 * 1000
  152. // })
  153. return Promise.reject(err)
  154. }
  155. )
  156. export default service