request.tsx 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { message, notification } from 'antd';
  2. import axios, { InternalAxiosRequestConfig } from 'axios'
  3. import { isOs, sign } from './index.ts';
  4. import { getGameId, getToken, removeToken } from './auth.ts';
  5. const errorCode: any = {
  6. '401': '认证失败,无法访问系统资源',
  7. '403': '当前操作没有权限',
  8. '404': '访问资源不存在',
  9. 'default': '系统未知错误,请反馈给管理员'
  10. }
  11. // 标识登录过期的状态
  12. let expired = false;
  13. axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
  14. // 创建axios实例
  15. const service = axios.create({
  16. // axios中请求配置有baseURL选项,表示请求URL公共部分
  17. baseURL: import.meta.env.VITE_APP_BASE_API,
  18. timeout: 1000 * 60 * 2
  19. })
  20. // request拦截器
  21. service.interceptors.request.use((config: InternalAxiosRequestConfig<any>) => {
  22. // 是否需要设置 token
  23. const isToken = (config.headers || {}).isToken === false
  24. let timestamp = Date.now()
  25. let token = getToken()
  26. if (token && !isToken && config?.headers) {
  27. config.headers['token'] = token // 让每个请求携带自定义token 请根据实际
  28. }
  29. config.headers['timestamp'] = timestamp
  30. config.headers['channel'] = window.location.search.substr(1) || window.location.search.substring(1) || ''
  31. config.headers['deviceType'] = 3
  32. config.headers['gameId'] = getGameId()
  33. config.headers['os'] = isOs()
  34. config.headers['sign'] = sign(timestamp)
  35. return config
  36. }, error => {
  37. console.log(error)
  38. Promise.reject(error)
  39. })
  40. // 响应拦截器
  41. service.interceptors.response.use(res => {
  42. // 未设置状态码则默认成功状态
  43. const code = res.data.code || 200;
  44. // 获取错误信息
  45. const msg = errorCode[code] || res.data.msg || errorCode['default']
  46. if (code === 401 || code === 40400) {
  47. message.error({
  48. content: msg || '请登录',
  49. onClose: () => {
  50. removeToken()
  51. window.location.reload()
  52. }
  53. })
  54. } else if (code === 310) {
  55. if (expired) return; // 避免多次触发
  56. expired = true;
  57. removeToken()
  58. message.error({
  59. content: msg,
  60. duration: 2,
  61. onClose: () => {
  62. window.location.reload()
  63. }
  64. })
  65. return Promise.reject(new Error(msg))
  66. } else if (code === 500) {
  67. message.error(msg)
  68. return Promise.reject(new Error(msg))
  69. } else if (code !== 200) {
  70. notification.error({
  71. message: code,
  72. description: msg
  73. })
  74. return Promise.reject('error')
  75. } else {
  76. return res.data
  77. }
  78. }, error => {
  79. let { message: msg } = error;
  80. if (msg == "Network Error") {
  81. msg = "后端接口连接异常";
  82. }
  83. else if (msg.includes("timeout")) {
  84. msg = "系统接口请求超时";
  85. }
  86. else if (msg.includes("Request failed with status code")) {
  87. msg = "系统接口" + msg.substr(msg.length - 3) + "异常";
  88. }
  89. // message.error({ content: msg, duration: 5 })
  90. return Promise.reject(error)
  91. })
  92. export default service