request.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. baseURL: '/api',
  19. })
  20. const cancelMethods: Record<string, Canceler> = {}
  21. _axios.interceptors.request.use((config: RequestConfig) => {
  22. config.showLoading && Toast.loading()
  23. cancelMethods[config.url!]?.()
  24. delete cancelMethods[config.url!]
  25. if (config.cancelable) {
  26. config.cancelToken = new axios.CancelToken(
  27. c => (cancelMethods[config.url!] = c)
  28. )
  29. }
  30. if (
  31. config.method === 'post' &&
  32. config.contentType !== 'json' &&
  33. Object.prototype.toString.call(config.data) === '[object Object]'
  34. ) {
  35. config.data = new URLSearchParams(config.data)
  36. }
  37. return config
  38. })
  39. _axios.interceptors.response.use(
  40. response => {
  41. const config = response.config as RequestConfig
  42. config.showLoading && Toast.hide()
  43. const data = response.data as ResponseData | Blob | undefined
  44. if (!data || data instanceof Blob || data.success) return data
  45. config.reportError !== false && Toast(data.message || netErrMsg)
  46. return Promise.reject(data)
  47. },
  48. error => {
  49. Toast.hide()
  50. if (!axios.isCancel(error) && error.config?.reportError) {
  51. Toast(netErrMsg)
  52. }
  53. return Promise.reject(error)
  54. }
  55. )
  56. export default function request<T = any>(
  57. config: RequestConfig
  58. ): Promise<ResponseData<T>> {
  59. config.transformRequest = ([] as any[]).concat(
  60. config.transformRequest || [],
  61. axios.defaults.transformRequest
  62. )
  63. return _axios(config) as any
  64. }
  65. request.get = <T = any>(url: string, config?: RequestConfig) =>
  66. request<T>({ ...config, url })
  67. request.post = <T = any>(url: string, data?: any, config?: RequestConfig) =>
  68. request<T>({ ...config, method: 'POST', url, data })