vue3+ts的axios的二次封装以及哀求参数(data、params、formData)的区分 ...

打印 上一主题 下一主题

主题 890|帖子 890|积分 2670

偶然候在二次封装axios时常常会遇到使用哀求参数的问题,下面就是我很好的区分这些参数的各自作用和使用场景,欢迎点赞评论哦~
首先明确axios 的一些基本配置选项
axios 提供了一个非常灵活的配置选项,答应你自定义哀求的各种属性。当你使用 axios 或者一个自定义的 axios 实例(如 axiosInstance)时,你可以通过 requestOptions 对象传递这些配置。以下是一些常见的 requestOptions 属性及其用途:
基本哀求配置


  • url (string): 哀求的 URL。
  • method (string): 哀求方法(比方 get, post, put, delete 等)。默认为 get。
  • baseURL (string): 用于设置哀求的基本 URL。
  • headers (object): 设置哀求头。
  • params (object): 设置 URL 查询参数。
  • data (any): 发送到服务器的数据。对于 POST、PUT 和 PATCH 哀求,这通常是哀求体。
  • timeout (number): 设置哀求超时时间(以毫秒为单位)。
  • responseType (string): 指定响应类型(比方 arraybuffer, blob, document, json, text, stream)。
  • responseEncoding (string): 指定响应编码(比方 utf8)。
  • xsrfCookieName (string): 用于 CSRF 掩护的 cookie 名称。
  • xsrfHeaderName (string): 用于 CSRF 掩护的 HTTP 头名称。
  • maxContentLength (number): 定义内容的最大长度(以字节为单位)。
  • maxBodyLength (number): 定义哀求体的最大长度(以字节为单位)。
  • validateStatus (function): 自定义状态码验证函数。
  • cancelToken (CancelToken): 用于取消哀求的令牌。
  • onUploadProgress (function): 上传进度变乱处置惩罚程序。
  • onDownloadProgress (function): 下载进度变乱处置惩罚程序。
  • auth (object): 包含 username 和 password 的对象,用于基本认证。
  • withCredentials (boolean): 是否发送 cookies。
  • transformRequest (array | function): 在哀求发送前对数据进行转换。
  • transformResponse (array | function): 在响应数据返回后对数据进行转换。
下面是封装的axios(可以鉴戒):
  1. import router from '@/router'
  2. import { useTagsViewStore } from '@/store/modules/tagsView'
  3. import { useUserStore } from '@/store/modules/user'
  4. import axios, { AxiosInstance, AxiosRequestConfig } from 'axios'
  5. import { ElLoading, ElMessageBox } from 'element-plus'
  6. import { Loading } from 'element-plus/es/components/loading/src/service'
  7. let loading = null
  8. class HttpRequest {
  9.   private readonly baseUrl: string = import.meta.env.VITE_BASE_REQUEST_URL
  10.   private defaultConfig() {
  11.     return {
  12.       baseURL: this.baseUrl,
  13.       timeout: 10000,
  14.       withCredentials: true,
  15.       headers: {
  16.         'Content-Type': 'application/json;charset=utf-8',
  17.       },
  18.     }
  19.   }
  20.   private interceptors(instance: AxiosInstance) {
  21.     // 请求拦截
  22.     instance.interceptors.request.use(
  23.       (config) => {
  24.         // 添加全局的loading..
  25.         loading = ElLoading.service({
  26.           fullscreen: true,
  27.           lock: true,
  28.           text: '正在加载...',
  29.           background: 'rgba(0, 0, 0, 0.7)',
  30.         })
  31.         // 请求头携带token
  32.         const UserStore = useUserStore()
  33.         const token = UserStore.token
  34.         if (token) {
  35.           config.headers.Authorization = 'Bearer ' + token
  36.         }
  37.         // console.log('请求拦截config', config)
  38.         return config
  39.       },
  40.       (error: any) => {
  41.         return Promise.reject(error)
  42.       },
  43.     )
  44.     //响应拦截
  45.     instance.interceptors.response.use(
  46.       (res) => {
  47.         // console.log('响应拦截res', res)
  48.         const UserStore = useUserStore()
  49.         const TagsViewStore = useTagsViewStore()
  50.         if (res.data.code != 200 && res.data.code != 401) {
  51.           loading.close()
  52.           ElMessage.error(res.data.msg)
  53.           return Promise.reject(res.data)
  54.         } else if (res.data.code === 401) {
  55.           loading.close()
  56.           ElMessageBox.alert('登录的信息已过期,请重新登录', '提示', {
  57.             confirmButtonText: '确定',
  58.             callback: async () => {
  59.               await router.go(0)
  60.               await UserStore.logout()
  61.               TagsViewStore.clearVisitedView()
  62.               ElMessage({
  63.                 type: 'success',
  64.                 message: '退出登录成功!需重新登录。',
  65.               })
  66.             },
  67.           })
  68.           // return Promise.reject(res.data)
  69.         }
  70.         loading.close()
  71.         return res
  72.       },
  73.       (error: any) => {
  74.         loading.close()
  75.         return Promise.reject(error)
  76.       },
  77.     )
  78.   }
  79.   public request(options: AxiosRequestConfig) {
  80.     const axiosInstance = axios.create()
  81.     let requestOptions: any = {}
  82.     if (options['method'].toLowerCase() == 'get') {
  83.       requestOptions = this.defaultConfig()
  84.       requestOptions.headers = {}
  85.       requestOptions = Object.assign(requestOptions, options)
  86.     } else {
  87.       requestOptions = this.defaultConfig()
  88.       for (let conf in options) {
  89.         if (conf == 'params') requestOptions['data'] = options[conf]
  90.         else requestOptions[conf] = options[conf]
  91.       }
  92.     }
  93.     this.interceptors(axiosInstance)
  94.     return axiosInstance(requestOptions)
  95.   }
  96. }
  97. const http = new HttpRequest()
  98. export default http
复制代码
详细代码剖析如下:
params(实用axios的get哀求):
在使用 axios 发送 GET 哀求时,你可以通过 params 参数来传递查询参数。params 是一个对象,此中的键值对会被转换为 URL 查询字符串。
哀求接口:http.request({ url: 'api/merAcct/list', method: 'get', params: {pageIndex: 1,pageSize:2}})
对应上面封装axios的逻辑片断
 public request(options: AxiosRequestConfig) {
    const axiosInstance = axios.create()
    let requestOptions: any = {}
    if (options['method'].toLowerCase() == 'get') {
      requestOptions = this.defaultConfig()
      requestOptions.headers = {}
      requestOptions = Object.assign(requestOptions, options)
    }
else {
      requestOptions = this.defaultConfig()
      for (let conf in options) {
        if (conf == 'params') requestOptions['data'] = options[conf]
        else requestOptions[conf] = options[conf]
      }
    }
    this.interceptors(axiosInstance)
    return axiosInstance(requestOptions)
  }
那么在axiosInstance(requestOptions)的requestOptions选项配置里面实际是下面这样的
因为  哀求头requestOptions.headers = {}
{
      baseURL: https://localhost:8080/
      url: 'api/merAcct/list',
      params: {pageIndex: 1,pageSize:2}
      timeout: 10000,
      withCredentials: true,
      headers: {},
实际上url会变成
  1. https://localhost:8080/api/merAcct/list?pageIndex=1&pageSize=20
复制代码
这就是你的实际哀求接口链接
data(实用axios的post哀求):
哀求接口:http.request({ url: 'api/merAcct/list', method: 'post', params: {pageIndex: 1,pageSize:2}})
对应上面封装axios的逻辑片断
 public request(options: AxiosRequestConfig) {
    const axiosInstance = axios.create()
    let requestOptions: any = {}
    if (options['method'].toLowerCase() == 'get') {
      requestOptions = this.defaultConfig()
      requestOptions.headers = {}
      requestOptions = Object.assign(requestOptions, options)
    } else {
      requestOptions = this.defaultConfig()
      for (let conf in options) {
        if (conf == 'params') requestOptions['data'] = options[conf]
        else requestOptions[conf] = options[conf]
      }

    }
    this.interceptors(axiosInstance)
    return axiosInstance(requestOptions)
  }
那么在axiosInstance(requestOptions)的requestOptions选项配置里面实际是下面这样的
因为if (conf == 'params') requestOptions['data'] = options[conf]所以把params的数据给到data参数,是JSON数据格式
{
      baseURL: https://localhost:8080/
      url: 'api/merAcct/list',
      data: {pageIndex: 1,pageSize:2}
      timeout: 10000,
      withCredentials: true,
      headers: {
        'Content-Type': 'application/json;charset=utf-8',
      },
实际上url会变成
 https://localhost:8080/api/merAcct/list
formData(实用axios的post哀求):
在 axios 中,requestOptions 对象本身并没有一个名为 formData 的属性。formData 通常是指你使用 FormData 对象来构建哀求体数据,并将其作为 data 属性传递给 axios 哀求。
http.request({ url: 'api/merAcct/list', method: 'post', params:formData})
通过if (conf == 'params') requestOptions['data'] = options[conf]转化成
  1. {
  2.       baseURL: https://localhost:8080/
  3.       url: 'api/merAcct/list',
  4.       data: {pageIndex: 1,pageSize:2}
  5.       timeout: 10000,
  6.       withCredentials: true,
  7.       headers: {
  8.        'Content-Type': 'multipart/form-data' // 设置适当的 Content-Type
  9.       },
复制代码
解说就到这了哦,不懂请留言或者私信我~


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表