当前位置: 首页 > news >正文

利用Axios封装及泛型实现定制化HTTP请求处理

      本案例旨在教授如何使用Axios库结合TypeScript泛型进行HTTP请求的高级封装,以提升代码的可复用性和类型安全性。我们将通过一个具体的示例,学习如何创建一个通用的请求函数,它能够适应不同类型的API响应,并在请求前后加入自定义逻辑(如错误处理、Token注入等)。

1. 引入必要的库和类型

  • 引入Axios:首先,我们导入Axios库及其相关类型,用于发起网络请求。
  • 定义类型:引入AxiosInstance和AxiosRequestConfig类型,以增强代码的类型提示和安全性。
import axios, { type AxiosResponse } from 'axios';
import type { AxiosInstance, AxiosRequestConfig } from 'axios';

2. 创建Axios实例并配置

  • 配置基础设置:通过axios.create方法创建一个Axios实例,并设置基础URL和超时时间等默认配置
const axiosInstance: AxiosInstance = axios.create({baseURL: 'https://tenapi.cn/v2/',timeout: 10000
});

3. 添加请求和响应拦截器

  • 请求拦截器:在请求发送前可以统一处理逻辑,如添加认证信息。
  • 响应拦截器:对返回的响应进行统一处理,如错误码判断。
axiosInstance.interceptors.request.use(config => {// 可以在此处添加Token或其他请求头return config;
}, error => Promise.reject(error));axiosInstance.interceptors.response.use(res => res, error => Promise.reject(error));

 4. 定义API响应接口

  • ApiResponse接口:定义一个泛型接口来规范API响应的结构,包含状态码、消息、时间戳和数据部分。
export interface ApiResponse<T = any> {code: number;msg: string;timestamp: number;data: T;
}

5. 封装请求函数

  • 泛型request函数:创建一个异步的泛型函数request,它接受请求配置并返回经过类型转换的响应数据。 
export async function request<T>(config: AxiosRequestConfig): Promise<T> {return axiosInstance.request<ApiResponse<T>>(config).then(res => res.data);
}

6. 使用封装的请求函数

  • 具体请求示例:定义一个数据模型Hot,并使用request函数发起请求,处理响应数据
interface Hot {name: string;url: string;hot: number;
}request<Array<Hot>>({url: '/baiduhot',method: 'get'
}).then(res => {if(res.code === 200) {const hot = res.data[0];console.log(hot.name);}
});

6. 完整代码

import axios, {type AxiosResponse} from 'axios';
import type { AxiosInstance, AxiosRequestConfig } from 'axios';/* 创建axios实例 */
const axiosInstance : AxiosInstance = axios.create({baseURL: 'https://tenapi.cn/v2/',timeout: 10000
});/* 封装实例的请求拦截器 */
axiosInstance.interceptors.request.use( config  => {return config;
}, (error) => {return Promise.reject(error);
});/* 封装实例的响应拦截器 */
axiosInstance.interceptors.response.use( (res : AxiosResponse<any>)  => {return res;
}, (error) => {return Promise.reject(error);
});/* 定义接口 */
export interface ApiResponse<T> {code: number;msg: string;timestamp: number;data: T;
}/* 封装实例的请求方法 */
export async function request<T>(config: AxiosRequestConfig ) {// axios实例的 request 接受的第一个泛型参数,就是返回数据data的类型return axiosInstance.request<ApiResponse<T>>(config).then((res) => res.data);
}/* 如何使用代码如下  */
interface Hot {name: string;url: string;hot: number;
}request<Array<Hot>>({url: '/baiduhot',method: 'get'
}).then(res => {if(res.code == 200) {let hot = res.data[0];console.log(hot.name);}
});

提示:更多的Axios配置信息请看官网

http://www.lryc.cn/news/373276.html

相关文章:

  • RN6752V1 高性能AHD转MIPIDVPBT656BT601芯片方案,目前适用于车载方案居多
  • Rust 基金会的商标政策更新引发社区争议
  • Java Opencv识别图片上的虫子
  • 微型操作系统内核源码详解系列五(1):arm cortex m3架构
  • 值传递和址传递
  • 【three.js】自定义物体形状BufferGeometry
  • Mac 使用 Homebrew 安装 Python3
  • 汽车行驶中是怎么保障轴瓦安全的?
  • 洗地机哪款好?洗地机十大名牌排行榜
  • spark mllib 特征学习笔记 (二)
  • 湘潭大学软件工程数据库2(题型,复习资源和计划)
  • 第二十三节:带你梳理Vue2:Vue插槽的认识和基本使用
  • 父亲节马上到了-和我一起用Python写父亲节的祝福吧
  • winform 应用程序 添加 wpf控件后影响窗体DPI改变
  • Web前端开发素材:探索、选择与应用的艺术
  • LeetCode | 20.有效的括号
  • ceph scrub 错误记录
  • cs与msf权限传递,以及mimikatz抓取明文密码
  • Windows下的zip压缩包版Mysql8.3.0数据迁移到Mysql8.4.0可以用拷贝data文件夹的方式
  • 软件体系结构笔记(自用)
  • java安装并配置环境
  • 探索互联网寻址机制 | 揭秘互联网技术的核心,解析网络寻址
  • C语言学习笔记之结构篇
  • C++笔记之一个函数多个返回值的方法、std::pair、std::tuple、std::tie的用法
  • GDB:从零开始入门GDB
  • 服务器权限管理
  • 08 SpringBoot 自定定义配置
  • Java之3DES(Triple DES)加密计算(DESede/ECB/ZeroPadding)
  • 从0开发一个Chrome插件:项目实战——广告拦截插件
  • C++ 32 之 静态成员函数