request.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import axios, { AxiosRequestConfig, Canceler } from 'axios'
  2. import Toast from '@/components/toast'
  3. export const netErrMsg = '系统开小差了,请稍候再试'
  4. interface RequestConfig extends AxiosRequestConfig {
  5. contentType?: 'json' | 'form'
  6. reportError?: boolean
  7. showLoading?: boolean
  8. cancelable?: boolean
  9. }
  10. interface ResponseData<T = any> {
  11. success: boolean
  12. results: T
  13. message: string
  14. [k: string]: any
  15. }
  16. const _axios = axios.create({
  17. baseURL: import.meta.env.VITE_API_BASE,
  18. })
  19. const cancelMethods: Record<string, Canceler> = {}
  20. _axios.interceptors.request.use((config: RequestConfig) => {
  21. config.showLoading && Toast.loading()
  22. cancelMethods[config.url!]?.()
  23. delete cancelMethods[config.url!]
  24. if (config.cancelable) {
  25. config.cancelToken = new axios.CancelToken(
  26. c => (cancelMethods[config.url!] = c)
  27. )
  28. }
  29. if (
  30. config.method === 'post' &&
  31. config.contentType !== 'json' &&
  32. Object.prototype.toString.call(config.data) === '[object Object]'
  33. ) {
  34. config.data = new URLSearchParams(config.data)
  35. }
  36. return config
  37. })
  38. _axios.interceptors.response.use(
  39. response => {
  40. const config = response.config as RequestConfig
  41. config.showLoading && Toast.hide()
  42. const data = response.data as ResponseData | Blob | undefined
  43. if (!data || data instanceof Blob || data.success) return data
  44. config.reportError !== false && Toast(data.message || netErrMsg)
  45. return Promise.reject(data)
  46. },
  47. error => {
  48. Toast.hide()
  49. if (!axios.isCancel(error) && error.config?.reportError) {
  50. Toast(netErrMsg)
  51. }
  52. return Promise.reject(error)
  53. }
  54. )
  55. export default function request<T = any>(
  56. config: RequestConfig
  57. ): Promise<ResponseData<T>> {
  58. config.transformRequest = ([] as any[]).concat(
  59. config.transformRequest || [],
  60. axios.defaults.transformRequest
  61. )
  62. return _axios(config) as any
  63. }
  64. request.get = <T = any>(url: string, config?: RequestConfig) =>
  65. request<T>({ ...config, url })
  66. request.post = <T = any>(url: string, data?: any, config?: RequestConfig) =>
  67. request<T>({ ...config, method: 'POST', url, data })