TypeScript项目中Axios的封装

目录

前言

一、axios中的常见类型

1. AxiosInstance

2. AxiosRequestConfig

3. AxiosResponse

4. AxiosError

二、axios封装步骤

三、封装后的完整代码

1. 基础封装

2. 高级封装


前言

为了实现统一的网络请求处理和管理,在日常开发中我们常常封装 axios,来实现统一配置、设置请求拦截器和响应拦截器、错误处理等。

TypeScript可以给项目提供类型检查和类型推导,axios请求回来的数据也会受其检查。本文将提供axios结合ts写法的封装步骤和代码。

一、axios中的常见类型

1. AxiosInstance

表示axios请求的配置选项,包括URL、方法、头部、参数等。

2. AxiosRequestConfig

表示一个axios实例的类型,可以用于创建自定义配置的axios实例。

3. AxiosResponse

表示axios响应的数据结构,包括状态码、响应头和响应数据。

4. AxiosError

表示axios请求发生错误时的错误对象,包括错误消息、请求配置和响应信息(如果有)。

注意:如果没有跟类型,ts也会自动推到成相应类型。可以不写,但不能错写。

二、axios封装步骤

1. 安装依赖

在项目根目录下,使用 npm 或 yarn 命令安装 axios 和 @types/axios(用于提供 axios 的类型定义文件)

pnpm install axios @types/axios

2. 创建封装文件

在项目中创建一个新的文件,例如 request.ts,用于封装 axios。可以根据项目需求结构化地组织这些文件。文件名根据个人习惯来,大都取 axios 、request 、http等。

3. 导入 axios

request.ts 文件中导入 axios 模块。

4. 添加默认配置

根据需要,在请求方法中设置默认的请求头、超时时间、响应数据格式等配置项。

5. 定义返回的数据类型

根据后端返回的数据,设置统一的请求结果接口。

6. 添加拦截器

如果需要使用拦截器,可以在 api.ts 文件中定义请求拦截器和响应拦截器,并注册到 axios 中。

7. 封装请求方法

根据项目需求,定义请求方法,例如 GET、POST、PUT、DELETE 等。可以使用泛型来指定请求和响应的数据类型,增加类型安全性。

8. 导出方法/实例

在 request.ts 文件末尾,将封装的请求方法进行导出。

三、封装后的完整代码

1. 基础封装

使用对象字面量方式创建一个单例的axios实例。

// 导入axios和所需的类型
import axios, { AxiosInstance, AxiosError, AxiosResponse, InternalAxiosRequestConfig } from 'axios'// 默认配置
const service: AxiosInstance = axios.create({baseURL: import.meta.env.VITE_API_BASE || '/' // 设置API的基本URL,默认为根路径
})// 请求拦截器,对请求配置进行一些处理或设置
service.interceptors.request.use((config: InternalAxiosRequestConfig) => {return config},(error: AxiosError) => {return Promise.reject(error)}
)// 响应拦截器,对响应结果进行处理或判断
service.interceptors.response.use((response: AxiosResponse) => {if (response.status === 200) {return response.data}return Promise.reject() // 如果响应状态不是200,则返回一个拒绝的Promise},(error: AxiosError) => {return Promise.reject(error)}
)export default service // 导出封装好的axios实例// 定义结果接口Result
export interface Result<T = unknown> {message: stringcode: numberdata: T[key: string]: any // 其他任意属性
}export const http = {// 发送GET请求的方法,可指定数据类型T,并返回一个Promise对象,其值为Result<T>类型get<T = any>(url: string, data?: object): Promise<Result<T>> {return service.get<T, Result<T>>(url, data);},// 发送POST请求的方法,同样可指定数据类型T,并返回一个Promise对象post<T = any>(url: string, data?: object): Promise<Result<T>> {return service.post<T, Result<T>>(url, data);},// 发送PUT请求的方法,同样可指定数据类型T,并返回一个Promise对象put<T = any>(url: string, data?: object): Promise<Result<T>> {return service.put<T, Result<T>>(url, data);},// 发送DELETE请求的方法,同样可指定数据类型T,并返回一个Promise对象delete<T = any>(url: string): Promise<Result<T>> {return service.delete<T, Result<T>>(url);},
};

2. 高级封装

相比基础封装,高级封装通过类的方式来创建实例,并将请求方法封装在类的原型上。

相比之下,这种方法更加灵活,可以创建多个不同配置的axios实例,也可以在实例中添加其他自定义的方法和属性。此外,高级封装还将请求方法统一封装在一个类中,结构更加清晰,易于维护和扩展。

// 先创建一个类,给类添加1个属性 instance代表axios的实例  构造函数传递配置 config配置比如全局的baseURL timeout
​
import axios from "axios";
import type {AxiosInstance,AxiosError,AxiosResponse,AxiosRequestConfig,
} from "axios";
​
// interface Result<T = any> {
//   data: T;
//   success: boolean;
// }
​
class Request {// 限制创建的实例必须是axios的实例private instance: AxiosInstance;// 这个config是不能乱写的,axios对创建的配置有限制的constructor(config: AxiosRequestConfig) {this.instance = axios.create(config);
​// 接下来配置axios实例身上的全局配置,比如拦截器this.instance.interceptors.request.use((config: AxiosRequestConfig) => {return config;},(error: AxiosError) => {return Promise.reject(error);});
​this.instance.interceptors.response.use((response: AxiosResponse) => {return response.data;},(error: AxiosError) => {return Promise.reject(error);});}
​// 公共方法,因为不知道返回值的类型fetchData<T>(options: AxiosRequestConfig): Promise<T> {// 将私有的instance上面发请求的操作,封装到这个实例方法request中,这个方法的返回值应该是一个promise对象return new Promise((resolve, reject) => {this.instance.request<any, T>(options).then((res) => {resolve(res);}).catch((err) => {reject(err);});});}
​// 调用上面封装的实例方法request,来实现get / post / delete / put 方法的快捷调用get<T>(options: AxiosRequestConfig): Promise<T> {return this.fetchData<T>({ ...options, method: "GET" });}
​post<T>(options: AxiosRequestConfig): Promise<T> {return this.fetchData({ ...options, method: "POST" });}
​put<T>(options: AxiosRequestConfig): Promise<T> {return this.fetchData({ ...options, method: "PUT" });}
​delete<T>(options: AxiosRequestConfig): Promise<T> {return this.fetchData({ ...options, method: "DELETE" });}
}
​
// 到处新new出来的实例
export const http = new Request({baseURL: "https://mock.mengxuegu.com/mock/6323def2b4c53348ed2bc5d7/example",
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/89152.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个步骤跳过 Unity 启动Logo | 多平台适用 | 官方API支持

前言【Unity实战篇 】 | 一个步骤跳过 Unity Logo 界面 | 多平台适用 | 官方API支持使用方法核心 API1. RuntimeInitializeOnLoadMethodAttribute2. SplashScreen效果展示总结前言 众所周知,使用Unity引擎打包的工程在启动时都带有Unity的默认启动Logo。这个问题可以通过购买U…

Codeforces Round 893 (Div. 2)ABC

Codeforces Round 892 (Div. 2) 目录 A. United We Stand题目大意思路代码 B. Olya and Game with Arrays题目大意思路代码 C. Another Permutation Problem题目大意思路代码 A. United We Stand 题目大意 给你一个数组&#xff0c;把这个数组分成两个数组a和b&#xff0c;使…

大数据-玩转数据-Flink RedisSink

一、添加Redis Connector依赖 具体版本根据实际情况确定 <dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-redis_2.11</artifactId><version>1.1.5</version> </dependency>二、启动redis 参…

使用KETTLE工具在Oracle和Dm8之间迁移数据

oracle 代码测试数据 CREATE TABLE PRODUCT_CATEGORY ( PRODUCT_CATEGORYID NUMBER(11,0) NOT NULL , NAME VARCHAR2(255) NOT NULL ENABLE, PRIMARY KEY (PRODUCT_CATEGORYID) )INSERT ALL into PRODUCT_CATEGORY(PRODUCT_CATEGORYID, NAME)VALUES(2,国学) into PRODUCT_CATEG…

Qt开发技术:Q3D图表开发笔记:Q3DSurface三维曲面图介绍、Demo以及代码详解

前言 qt提供了q3d进行三维开发&#xff0c;虽然这个框架没有得到大量运用也不是那么成功&#xff0c;性能上也有很大的欠缺&#xff0c;但是普通的点到为止的应用展示还是可以的。   其中就包括华丽绚烂的三维图表&#xff0c;数据量不大的时候是可以使用的。   前面介绍了…

win10电脑右下角不显示电脑图标,但是能正常上网,怎么解决?

一、问题描述 win10系统更新后&#xff0c;电脑右下角不显示小电脑图标&#xff0c;但是能正常上网&#xff0c;而且用命令测试时显示的是192打头的网址。 二、解决方法 运行命令提示符窗口&#xff0c;在命令提示符中输入&#xff1a;netsh winsock reset&#xff08; 如果提示…

学习pytorch 3 tensorboard的使用

tensorboard的使用 1. 安装2. add_scalar 查看函数图形3. 查看结果4. add_image() 查看训练步骤中间结果的图片 1. 安装 pytorch conda环境 pip install tensorboard pip install opencv-python2. add_scalar 查看函数图形 常用来查看 train val loss等函数图形 from torch…

第57步 深度学习图像识别:CNN可视化(Pytorch)

基于WIN10的64位系统演示 一、写在前面 由于不少模型使用的是Pytorch&#xff0c;因此这一期补上基于Pytorch实现CNN可视化的教程和代码&#xff0c;以SqueezeNet模型为例。 二、CNN可视化实战 继续使用胸片的数据集&#xff1a;肺结核病人和健康人的胸片的识别。其中&…

Java整合Selenium录制视频

捕捉视频 有时候我们未必能够分析故障只需用日志文件或截图的帮助。有时捕获完整的执行视频帮助。让我们了解如何捕捉视频。 我们将利用Monte媒体库的执行相同。 配置 第1步&#xff1a;导航到URL下载屏幕记录JAR&#xff0c;如下图所示。 http://www.randelshofer.ch/monte…

day24-106.从中序与后序遍历序列构造二叉树

106.从中序与后序遍历序列构造二叉树 力扣题目链接(opens new window) 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如&#xff0c;给出 中序遍历 inorder [9,3,15,20,7]后序遍历 postorder [9,15,7,20,3] 返回如下的二叉树&am…

如何在win10系统上使用旧版本的IE浏览器

win10系统打开IE浏览器自动变成了Edge浏览器&#xff0c;切换成IE模式时&#xff0c;IE浏览器的版本默认为IE11&#xff08;注&#xff1a;Edge浏览器只支持IE11&#xff09;&#xff0c;有些网站只能使用IE浏览器打开或者在做一些兼容性测试时&#xff0c;需要使用到不同版本的…

PLC求解弹簧质量模型微分方程数值解(RK4梯形图程序)

微分方程的数值求解,属于数学分析类课程涉及的内容。大家可以参看相关书籍对Runge-Kutta法的介绍,弹簧质量阻尼模型详细的微分方程介绍可以查看下面文章,链接如下: 弹簧质量阻尼系统前馈PID位置控制(PLC闭环仿真SCL+ST代码)_RXXW_Dor的博客-CSDN博客带前馈控制的博途PID程…

【数据结构•堆】堆排序(理论基础)

堆的定义  • 堆是一个完全二叉树   –所有叶子在同一层或者两个连续层   –最后一层的结点占据尽量左的位置  • 堆性质   –为空, 或者最小元素在根上   –两棵子树也是堆 存储方式  • 最小堆的元素保存在heap[1..hs]内   – 根在heap[1]   –K的左儿子是2k,…

在线吉他调音

先看效果&#xff08;图片没有声&#xff0c;可以下载源码看看&#xff0c;比这更好~&#xff09;&#xff1a; 再看代码&#xff08;查看更多&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&quo…

【Unity】VS Code 没有智能提示 Unity 中的类

正常来说&#xff0c;VS Code中会对部分输入类名进行提示&#xff0c;如下图所述 假如你从Unity 中进入 VS Code后发现没有提示相关 Unity的类&#xff0c;可能是 Unity 中 有关于 VS Code的相关Package 没有跟着 VS Code升级到最新版本。 点击Unity Windows 下拉框中的 Pac…

基于Promise.resolve实现Koa请求队列中间件

本文作者为360奇舞团前端工程师 前言 最近在做一个 AIGC 项目&#xff0c;后端基于 Koa2 实现。其中有一个需求就是调用兄弟业务线服务端 AIGC 能力生成图片。但由于目前兄弟业务线的 AIGC 项目也是处于测试阶段&#xff0c;能够提供的服务器资源有限&#xff0c;当并发请求资源…

直播带货热潮:海外网红直播对产品推广的影响与机遇

随着互联网的快速发展和社交媒体的普及&#xff0c;直播带货成为了一种风靡全球的新型营销方式。其中&#xff0c;海外网红直播作为直播带货的一种形式&#xff0c;引起了广泛的关注。海外网红以其独特的个人魅力和粉丝基础&#xff0c;成为了产品推广的强有力渠道。本文Nox聚星…

SpringBoot 异步、邮件任务

异步任务 创建一个Hello项目 创建一个类AsyncService 异步处理还是非常常用的&#xff0c;比如我们在网站上发送邮件&#xff0c;后台会去发送邮件&#xff0c;此时前台会造成响应不动&#xff0c;直到邮件发送完毕&#xff0c;响应才会成功&#xff0c;所以我们一般会采用多线…

JVM 调优实例

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ JVM提供了多种垃圾回收器&#xff0c;可以根据应用程序的需求选择最适合的垃圾回收器。例如&#xff0c;如果应用程序需要更快的响应时间&#xff0c;可以选择并行垃圾回收…

从源代码编译构建Apach Spark3.2.4

从源代码编译构建Apach Spark3.2.4 编译说明编译Apache Spark下载源码构建环境准备使用本地Maven构建更改Scala版本下载Jar包构建可运行的发行版构建异常构建成功 运行测试 编译说明 对于大多数用户来说&#xff0c;使用官方预编译版本的Spark已经足够满足日常需求。只有在特定…