使用Typescript对Axios举行二次封装

打印 上一主题 下一主题

主题 774|帖子 774|积分 2322

概要

在web开发中,常需要使用axios举行网络哀求为了防止axios不再维护时出现了bug因此为了增加项目的安全性对axios举行二次封装,当axios不再维护即可选择换一个库敏捷重新使用项目
团体架构流程

本文的axios二次封装采用TS的技术栈,通过对request的细节封装后,对get、patch等方法封装,对每一个类创建的实例和每一次的单一哀求的拦截器都举行的封装,增强了原生axios的功能
代码细节



  • 封装代码 - 在service文件夹下的request文件夹下的index.ts文件
  1. import axios from "axios";
  2. import type { AxiosInstance, AxiosRequestConfig, AxiosRequestHeaders, AxiosResponse, CreateAxiosDefaults, InternalAxiosRequestConfig } from "axios";
  3. // 针对CreateAxiosDefaults配置进行扩展
  4. // 使其可以添加对应的拦截器来使用
  5. interface DCRequestConfig<T = AxiosResponse> extends CreateAxiosDefaults{
  6.     interceptors?: {
  7.         requestSuccessFn?: (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig
  8.         requestFailureFn?: (err: any) => any
  9.         responseSuccessFn?: (res: T) => T
  10.         responseFailureFn?: (err: any) => any
  11.     }
  12. }
  13. // 定义单一网络请求时的类型
  14. interface newDCRequestConfig<T = AxiosResponse> extends AxiosRequestConfig{
  15.     interceptors?: {
  16.         requestSuccessFn?: (config: any) => any
  17.         requestFailureFn?: (err: any) => any
  18.         responseSuccessFn?: (res: T) => T
  19.         responseFailureFn?: (err: any) => any
  20.     }
  21. }
  22. class DCRequest {
  23.   public instance: AxiosInstance;
  24.   // request实例 => axios实例
  25.   constructor(config: DCRequestConfig) {
  26.     this.instance = axios.create(config);
  27.     // 每个instance实例都添加拦截器
  28.     // 请求成功和失败的拦截
  29.     this.instance.interceptors.request.use(config => {
  30.         console.log('全局的请求成功拦截');
  31.         return config
  32.     }, err => {
  33.         console.log('全局请求失败的拦截');
  34.         return err
  35.     })
  36.     // 响应成功和失败的拦截
  37.     this.instance.interceptors.response.use(res => {
  38.         console.log('全局的响应成功拦截');
  39.         return res.data
  40.     }, err => {
  41.         console.log('全局的响应失败的拦截');
  42.         return err
  43.     })
  44.     // 针对特定的request实例添加拦截器
  45.     if(config.interceptors){
  46.         this.instance.interceptors.request.use(
  47.             config.interceptors.requestSuccessFn,
  48.             config.interceptors.requestFailureFn
  49.         )
  50.         this.instance.interceptors.response.use(
  51.             config.interceptors.responseSuccessFn,
  52.             config.interceptors.responseFailureFn
  53.         )
  54.     }
  55.   }
  56.   // 封装网络请求方法
  57.   request<T = any>(config: newDCRequestConfig<T>) {
  58.     if(config.interceptors?.requestSuccessFn) {
  59.         // 单次请求成功的拦截
  60.         config = config.interceptors.requestSuccessFn(config)
  61.     }
  62.     return new Promise<T>((resolve, reject) => {
  63.         this.instance.request<any, T>(config).then(res => {
  64.             // 单次响应成功的拦截
  65.             if(config.interceptors?.responseSuccessFn){
  66.                 res = config.interceptors.responseSuccessFn(res)
  67.             }
  68.             resolve(res)
  69.         }).catch(err => {
  70.             reject(err)
  71.         })
  72.     })
  73.   }
  74.   get<T = any>(config: newDCRequestConfig<T>) {
  75.     return this.request({ ...config, method: "GET" })
  76.   }
  77.   post<T = any>(config: newDCRequestConfig<T>) {
  78.     return this.request({ ...config, method: "POST" })
  79.   }
  80.   delete<T = any>(config: newDCRequestConfig<T>) {
  81.     return this.request({ ...config, method: "DELETE" })
  82.   }
  83.   patch<T = any>(config: newDCRequestConfig<T>) {
  84.     return this.request({ ...config, method: "PATCH" })
  85.   }
  86. }
  87. export default DCRequest;
复制代码


  • 使用二次封装的axios - 在service文件夹下的index.ts文件
  1. import DCRequest from "./request";
  2. const dcRequest = new DCRequest({
  3.     baseURL: 'http://codercba.com:8000',
  4.     timeout: 10000,
  5.     interceptors: {
  6.         requestSuccessFn: (config) => {
  7.             console.log('单一请求成功的拦截');
  8.             
  9.             return config
  10.         },
  11.         requestFailureFn: (err) => {
  12.             return err
  13.         },
  14.         responseSuccessFn: (res) => {
  15.             console.log('单一响应成功的拦截');
  16.             return res
  17.         },
  18.         responseFailureFn: (err) => {
  19.             return err
  20.         }
  21.     }
  22. })
  23. export default dcRequest
复制代码


  • 在service文件夹下的module文件夹下的home.ts
  1. import dcRequest from "..";
  2. interface IInfo {
  3.     data: any
  4.     returnCode: string,
  5.     success: boolean
  6. }
  7. dcRequest.request<IInfo>({
  8.     url: '/home/multidata',
  9.     interceptors: {
  10.         requestSuccessFn: (config) => {
  11.             console.log('请求成功的拦截');
  12.             
  13.             return config
  14.         },
  15.         responseSuccessFn: (res) => {
  16.             console.log('应成功的拦截');
  17.             return res
  18.         }
  19.     }
  20. }).then(res => {
  21.     console.log(res);
  22. })
复制代码
小结

作者水平有限,由于拦截器的 InternalAxiosRequestConfig中的headers范例不兼容于AxiosRequestConfig的hedaers哀求,想过在界说newDCRequestConfig范例时,把headers范例转化为InternalAxiosRequestConfig中的headers范例,但始终觉得不当,望有大神可以提供方法
  假如本文对你有资助,麻烦点个赞和关注,谢谢

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

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

用多少眼泪才能让你相信

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

标签云

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