request.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import axios from 'axios'
  2. import { deleteToken, getToken } from '@/utils/auth'
  3. import qs from 'qs'
  4. import router from '@/router'
  5. import { blobToJson } from '@/utils'
  6. const service = axios.create({
  7. baseURL: process.env.VUE_APP_BASE_API,
  8. timeout: 120000 // request timeout
  9. })
  10. // request interceptor
  11. // 发送请求拦截器
  12. service.interceptors.request.use(
  13. config => {
  14. const token = getToken()
  15. if (token) config.headers.Authorization = `Bearer ${token}`
  16. return config
  17. },
  18. error => {
  19. return Promise.reject(error)
  20. }
  21. )
  22. // response interceptor
  23. // 请求返回之后的拦截器
  24. service.interceptors.response.use(
  25. async response => {
  26. const res = response.data
  27. if (response.request.responseType === 'blob') {
  28. // 返回的文件流当报错时转化成json
  29. if (response.headers['content-type'] === 'application/json') {
  30. try {
  31. const result = await blobToJson(res)
  32. return Promise.reject(result.msg)
  33. } catch (error) {
  34. return Promise.reject(error)
  35. }
  36. }
  37. const name = response.headers['content-disposition']
  38. return {
  39. data: res,
  40. name: name ? decodeURI(name.replace('attachment;filename=', '')) : '未命名'
  41. }
  42. }
  43. // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
  44. if ([50008, 50012, 50014, 402000, 401].includes(res.code)) {
  45. deleteToken()
  46. const redirect = router.currentRoute.fullPath
  47. router.push({ path: '/login-local', query: { redirect } })
  48. return Promise.reject(res.message)
  49. }
  50. // 登录验证码过期
  51. if (res.code === 60902) {
  52. return Promise.reject(res)
  53. }
  54. if (res.code !== 200) {
  55. if (res.data && Object.keys(res.data)?.length) {
  56. return Promise.reject(res)
  57. }
  58. return Promise.reject(res.message)
  59. }
  60. return res
  61. },
  62. error => {
  63. if (error.response && error.response.status === 401) {
  64. deleteToken()
  65. const redirect = router.currentRoute.fullPath
  66. if (router.currentRoute.path !== '/login-local') {
  67. router.push({ path: '/login-local', query: { redirect } })
  68. }
  69. }
  70. return Promise.reject(error.message || error)
  71. }
  72. )
  73. // 请求方法
  74. const http = {
  75. post (url, params, config = {}) {
  76. return service.post(url, params, {
  77. transformRequest: [(params) => {
  78. return JSON.stringify(params)
  79. }],
  80. headers: {
  81. 'Content-Type': 'application/json'
  82. },
  83. ...config
  84. })
  85. },
  86. get (url, params) {
  87. return service.get(url, {
  88. params: params,
  89. paramsSerializer: (params) => {
  90. return qs.stringify(params)
  91. }
  92. })
  93. },
  94. put (url, params) {
  95. return service.put(url, {
  96. ...params
  97. })
  98. },
  99. del (url, params) {
  100. return service.delete(url, {
  101. params: params
  102. })
  103. },
  104. formData (url, params) {
  105. return service.post(url, params, {
  106. timeout: 600000,
  107. headers: {
  108. 'Content-Type': 'application/x-www-form-urlencoded'
  109. }
  110. })
  111. },
  112. upload (url, params) {
  113. return service.post(url, params, {
  114. timeout: 600000,
  115. headers: {
  116. 'Content-Type': 'multipart/form-data'
  117. }
  118. })
  119. },
  120. download (url, params) {
  121. return service.post(url, params, {
  122. timeout: 10000,
  123. headers: {
  124. 'Content-Type': 'application/json'
  125. },
  126. responseType: 'blob'
  127. })
  128. },
  129. getDownload (url, params) {
  130. return service.get(url, {
  131. params,
  132. timeout: 10000,
  133. responseType: 'blob'
  134. })
  135. }
  136. }
  137. export default http