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.mzph.cn/news/35959.shtml

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

相关文章

TiDB v7.1.0 跨业务系统多租户解决方案

本文介绍了 TiDB 数据库的资源管控技术&#xff0c;并通过业务测试验证了效果。资源管控技术旨在解决多业务共用一个集群时的资源隔离和负载问题&#xff0c;通过资源组概念&#xff0c;可以限制不同业务的计算和 I/O 资源&#xff0c;实现资源隔离和优先级调度&#xff0c;提高…

Patch SCN一键解决ORA-600 2662故障---惜分飞

客户强制重启库之后,数据库启动报ORA-600 2037,ORA-745 kcbs_reset_pool/kcbzre1等错误 Wed Aug 09 13:25:38 2023 alter database mount exclusive Successful mount of redo thread 1, with mount id 1672229586 Database mounted in Exclusive Mode Lost write protection d…

SpringCloud微服务之间如何进行用户信息传递(涉及:Gateway、OpenFeign组件)

目录 1、想达到的效果2、用户信息在微服务之间传递的两种途径3、用RuoYi-Cloud为例进行演示说明&#xff08;1&#xff09;网关将用户信息写在请求头中&#xff08;2&#xff09;业务微服务之间通过OpenFeign进行调用&#xff0c;并且将用户信息写在OpenFeign准备的请求头中&am…

香港站群服务器为什么适合seo优化?

​  香港站群为什么适合seo优化?本文主要从以下四点出发进行原因阐述。 1.香港站群服务器的优势 2.香港站群服务器与国内服务器的对比 3.多IP站群服务器的优势 4.香港站群服务器在SEO优化中的注意事项 1.香港站群服务器的优势 香港站群服务器是为了满足企业SEO优化需求而提供…

GD32F103VE使用DMA传输读取内部温度和参考电压值

GD32F103VE使用DMA传输读取内部温度和参考电压值。出厂CPU芯片不同&#xff0c;温度误差不同&#xff0c;不要纠结了。 GD32F103的ADC为12位AD转换器,ADC转换结果保存在16位数据寄存器中; 模拟输入通道&#xff1a; 16个外部模拟输入通道; 1个内部温度传感器通道(Vsense) 1个…

【electron】electron安装过慢和打包报错:Unable to load file:

文章目录 一、安装过慢问题:二、打包报错&#xff1a;Unable to load file: 一、安装过慢问题: 一直处于安装过程 【解决】 #修改npm的配置文件 npm config edit#添加配置 electron_mirrorhttps://cdn.npm.taobao.org/dist/electron/二、打包报错&#xff1a;Unable to load…

camera hal|如何学习一个新平台

全网最具价值的Android Camera开发学习系列资料~ 作者:8年Android Camera开发,从Camera app一直做到Hal和驱动~ 欢迎订阅,相信能扩展你的知识面,提升个人能力~ 我自己目前从事的是android camera hal 的工作,工作上接触到的芯片平台要么是高通的,要么是mtk的。 其实…

c语言作业

作业1&#xff1a; 关于实参和形参 形参是实参的一份临时拷贝。 形参是在函数调用的时候才实例化&#xff0c;才开辟内存空间。 函数调用如果采用传值调用&#xff0c;改变形象不影响实参。 改变形参不是影响实参。 作业2&#xff1a; 函数调用exec&#xff08;&#xf…

C++QT教程3——手册4.11.1自带教程(笔记)——创建一个基于Qt Widget的应用程序

文章目录 创建一个基于Qt Widget的应用程序创建Text Finder项目素材文件 填补缺失的部分设计用户界面完成头文件完成源文件创建资源文件 编译和运行程序 参考文章 创建一个基于Qt Widget的应用程序 本教程介绍如何使用Qt Creator创建一个小型Qt应用程序&#xff0c;名为Text F…

电脑IP地址错误无法上网怎么办?

电脑出现IP地址错误后就将无法连接网络&#xff0c;从而无法正常访问互联网。那么当电脑出现IP地址错误时该怎么办呢&#xff1f; 确认是否禁用本地连接 你需要先确定是否禁用了本地网络连接&#xff0c;如果发现禁用&#xff0c;则将其启用即可。 启用方法&#xff1a;点击桌…

Spring 使用注解开发、代理模式、AOP

使用注解开发 在Spring4之后&#xff0c;要使用注解开发&#xff0c;必须要保证AOP的包导入了 项目搭建&#xff1a; 在配置文件中导入约束&#xff0c;增加注解支持 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.spri…

uniapp把城市换成26个字母和城市排序

后端返回的数据 我们要得效果 <template><view><view v-for"(value,key) in cities" :key"key"><view style"color: red;"> {{ key }} </view><view style"border: 1rpx solid black;"><tex…

PostgreSql 备份恢复

一、概述 数据库备份一般可分为物理备份和逻辑备份&#xff0c;其中物理备份又可分为物理冷备和物理热备&#xff0c;下面就各种备份方式进行详细说明&#xff08;一般情况下&#xff0c;生产环境采取的定时物理热备逻辑备份的方式&#xff0c;均是以下述方式为基础进一步研发编…

Linux 基础

巩固基础&#xff0c;砥砺前行 。 只有不断重复&#xff0c;才能做到超越自己。 能坚持把简单的事情做到极致&#xff0c;也是不容易的。 linux的目录结构 linux的文件系统采用树状的目录结构&#xff0c;在此结构的最上层是根目录“/”&#xff0c; 然后在此目录下再创建其他…

【算法——双指针】LeetCode 1089 复写零

千万不要被这道题标注着“简单”迷惑了&#xff0c;实际上需要注意的细节很多。 题目描述&#xff1a; 解题思路&#xff1a; 正序遍历&#xff0c;确定结果数组的最后一个元素所在的位置&#xff1b;知道最后一个元素的位置后倒序进行填充。 先找到最后一个需要复写的数 先…

javaee dom4j读取xml文件

引入jar包 dom4j-1.6.1.jar 创建xml文件 <?xml version"1.0" encoding"UTF-8"?> <books><book id"1"><title ID"t1">背影</title><price>88</price><author>三毛</author>…

Excel表格制作,快速提升效率好方法!

“作为一个刚开始工作的职场新人&#xff0c;每天要做各种不同的表格&#xff0c;真的让我很崩溃&#xff0c;感觉我对这些表格制作一点都不了解&#xff0c;Excel表格制作有什么比较好的方法吗&#xff1f;” Excel作为一款广泛应用于各个领域的管理和分析工作&#xff0c;给我…

【STM32】FreeRTOS消息队列和信号量学习

一、消息队列&#xff08;queue&#xff09; 队列是一种用于实现任务与任务之间&#xff0c;任务与中断之间消息交流的机制。 注意&#xff1a;1.数据的操作是FIFO模式。 2.队列需要明确数据的大小和队列的长度。 3.写和读都会出现堵塞。 实验&#xff1a;创建一个消息队列…

qt5.15.2 使用mysql8.1

报错&#xff1a; QMYSQL driver not loaded 报错&#xff1a;无 QMYSQL 使用 QStringList drivers QSqlDatabase::drivers(); //获取现在可用的数据库驱动 foreach(QString driver, drivers) qDebug() << driver; “QSQLITE” “QMARIADB” “QMYSQL” “QMYSQL3” “…

Linux常用命令——dmidecode命令

在线Linux命令查询工具 dmidecode 在Linux系统下获取有关硬件方面的信息 补充说明 dmidecode命令可以让你在Linux系统下获取有关硬件方面的信息。dmidecode的作用是将DMI数据库中的信息解码&#xff0c;以可读的文本方式显示。由于DMI信息可以人为修改&#xff0c;因此里面…