如何在typescript中使用axios来封装一个HttpClient类

我们通常开始直接在代码中使用像axios这样的第三方库。这没有错。但是,在不断变化的库,软件包,版本等世界中,直接使用这些库API可能会导致代码不一致。

一个好的做法是创建自己的抽象并将对库API的调用包装到包装器中。这将使您保持代码更加一致,并且在将来需要时也可以更轻松地切换到其他库或者程序包。这是因为您将所有对第三方库的调用都包装在一个位置,并且只要包装器接口没有更改,就可以替换包装器方法的实现以切换到新库。

让我们开始写代码

在用于发出Http请求的代码的特定情况下,我们可以创建一个名为IHttpClient的接口,然后创建一个名为HttpClient的类来实现该接口。在我们的HttpClient方法中,我们将调用axios方法。

现在,让我们假设HttpClient仅具有通用的get和post方法:

export interface IHttpClient {get<T>(parameters: IHttpClientRequestParameters): Promise<T>post<T>(parameters: IHttpClientRequestParameters): Promise<T>
}

我们还需要一个接口,以将我们的参数传递给带有一个参数的get和post,以避免代码混乱。我们将其称为IHttpClientRequestParameters,它将花费一些通用时间T来定义传入的有效负载的类型(如果有)以及用于任何类型的Http请求的其他通用参数:

export interface IHttpClientRequestParameters<T> {url: stringrequiresToken: booleanpayload?: T
}

这是请求参数接口的每个属性的详细说明:

url:这是我们需要向其发出请求的API端点的完整url(必须包含查询字符串参数)

requireToken:这是一个布尔值,指示我们的请求是否还必须添加身份验证令牌(即Jwt令牌)

有效负载:这是POST或PUT请求的有效负载,因此是可选的。现在,我们可以编码HttpClient类,以实现IHttpClient接口并使用axios。首先,从axios导入所需的内容,并编写尚未实现的HttpClient类的初始声明:

import axios, { AxiosRequestConfig, AxiosError, AxiosResponse } from 'axios'export class HttpClient implements IHttpClient {// ... implementation code will go here
}

现在,按照界面中的定义添加get方法的实现。请注意,这里我使用的是Promise语法,但是欢迎您使用async / await语法。我们的get方法将使用IHttpClientRequestParameters的实例并返回Promise:

get<T>(parameters: IHttpClientRequestParameters): Promise<T> {return new Promise<T>((resolve, reject) => {// extract the individual parametersconst { url, requiresToken } = parameters // axios request options like headers etcconst options: AxiosRequestConfig = {headers: {}}// if API endpoint requires a token, we'll need to add a way to add this.if (requiresToken) {const token = this.getToken()options.headers.RequestVerificationToken = token}// finally execute the GET request with axios:axios.get(url, options).then((response: any) => {resolve(response.data as T)}).catch((response: any) => {reject(response)})})
}

同样,现在添加接口中定义的post方法的实现。像get一样,我们的post方法将采用IHttpClientRequestParameters的实例并返回Promise:

post<T>(parameters: IHttpClientRequestParameters): Promise<T> {return new Promise<T>((resolve, reject) => {const { url, payload, requiresToken } = parameters// axios request options like headers etcconst options: AxiosRequestConfig = {headers: {}}// if API endpoint requires a token, we'll need to add a way to add this.if (requiresToken) {const token = this.getToken()options.headers.RequestVerificationToken = token}// finally execute the GET request with axios:axios.post(url, payload, options).then((response: any) => {resolve(response.data as T)}).catch((response: any) => {reject(response)})})
}

现在,您可以导出HttpClient的实例并在整个代码中使用:

export const httpClient = new HttpClient()

这是一个示例,我们使用它来获取IItem类型的“项目”列表:

fetchItems(): Promise<IItem[]> {// prepare our request parametersconst getParameters: IHttpClientPostParameters = {url: 'http://yourapiurl/items',requiresToken: false}// just return httpClient.get (which is a promise) or again use async/await if you preferreturn httpClient.get<IItem[]>(getParameters)
}

总结

现在,您有了一个HttpClient,它抽象了不同的Http请求(如get或post等)并将代码封装在一个地方。在HttpClient中,您可以使用axios或者其他平台的请求库亦或其他请求协议,这样并不会污染你外部的代码。

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

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

相关文章

c语言函数传参详解

24.1.普通变量作为函数形参 (1)普通变量作为参数在函数传参时&#xff0c;形参和实参名字可以相同也可以不同&#xff0c;实际上都是用实参来替代相应的形参的。 (2)在字函数内部&#xff0c;形参的值等于实参。原因是函数调用时把实参的值赋值给了形参。这就是所谓的”传值调用…

gRPC Web使用指南

gRPC 是一个高性能、通用的开源 RPC 框架&#xff0c;其由 Google 主要面向移动应用开发并基于 HTTP/2 协议标准而设计&#xff0c;基于 ProtoBuf (Protocol Buffers) 序列化协议开发&#xff0c;且支持众多开发语言&#xff08;&#xff09;。gRPC 提供了一种简单的方法来精确…

C# 发送email邮件!

利用C#邮件发送邮箱使用到两个类SmtpClient和MailMessage。可以把SmtpClient看做发送邮件信息的客户端&#xff0c;而把MailMessage看做需要发送的消息。 下面是我写的发送邮件的公共方法&#xff1a; 1 /// <summary>2 /// 3 /// </summary>4 …

JUnit 5 –扩展模型

我们已经对Java最普遍的测试框架的下一个版本了解很多。 现在让我们看一下JUnit 5扩展模型&#xff0c;该模型将允许库和框架将自己的实现添加到JUnit中。 总览 设定 基本 建筑 扩展模型 条件 注射 … 在新兴的《 JUnit 5用户指南》中可以找到您将在此处阅读的更多内容…

软件工程实验5

SA17225400 哪来的妖精 《软件工程&#xff08;C编码实践篇&#xff09;》MOOC课程作业http://mooc.study.163.com/course/USTC-1000002006 GitHub &#xff1a;https://github.com/littlewulei/Software-Engineering-Lab.git 实验要求&#xff08;参照视频中的具体实验过程&…

纯CSS实现水波纹效果

首先我们从结构和样式两个方面来讲解以上动图的实现过程&#xff1a;Html结构&#xff1a;<div class"square"><span></span><span></span><span></span><div class"content"><h2>Post Title</h…

乡村医生需要什么,看这张图就够了!

乡村医生需要什么&#xff0c;看这张图就够了&#xff01; 笔者最近在重庆市人民政府公开信箱中看到了一位赤脚医生写给政府的公开信&#xff0c;因读后无比感动&#xff0c;索性就摘录了出来&#xff1a; 来信内容&#xff1a; 我们是70-80年代的赤脚医生&#xff0c;是计划生…

java并发任务执行_Java并发性-任务反馈

java并发任务执行从我 上一篇 关于java.util.concurrent包的 文章 的结尾处 摘下来 &#xff0c;这很有趣&#xff0c;有时甚至必须在并发任务启动后从它们那里获得反馈。 例如&#xff0c;假设一个应用程序必须发送电子邮件批处理&#xff0c;除了使用多线程机制外&#xff0c…

Handsfree.js — 一个通过计算机视觉集成手势,面部表情和各种姿势识别的前端库

当电视上出现上图这种科技大片的时候&#xff0c;有没有幻想过有一天可以实现上图的这种交互&#xff0c;当我打开Handsfree这个库的介绍页时&#xff0c;看到前端页面竟然能够识别人的手势&#xff0c;面部以及各种肢体动作&#xff0c;简直刷新了我对前端能力的认知。确信这种…

Python中什么是set

Python中什么是set dict的作用是建立一组 key 和一组 value 的映射关系&#xff0c;dict的key是不能重复的。 有的时候&#xff0c;我们只想要 dict 的 key&#xff0c;不关心 key 对应的 value&#xff0c;目的就是保证这个集合的元素不会重复&#xff0c;这时&#xff0c;set…

SpringBoot:与JOOQ合作

在上一篇文章SpringBoot&#xff1a;与MyBatis一起工作中&#xff0c;我们学习了如何使用SpringBoot MyBatis Starter快速启动并运行Spring和MyBatis。 在本文中&#xff0c;我们将学习如何使用SpringBoot JOOQ Starter。 JOOQ&#xff08;面向Java对象的查询&#xff09;是包…

uni-app使用前的调研和开发心得

背景之前的工时系统是原生的小程序实现&#xff0c;由于产品逻辑需要优化&#xff0c;代码混乱又仅限微信平台使用&#xff0c;公司致力于想给工时系统重构后支持多平台&#xff0c;并对外开放使用&#xff0c;使之成为一款真正的商业产品。经过前期调研后&#xff0c;uni-app对…

EXPORT_SYMBOL使用

EXPORT_SYMBOL只出现在2.6内核中&#xff0c;在2.4内核默认的非static 函数和变量都会自动导入到kernel 空间的&#xff0c; 都不用EXPORT_SYMBOL() 做标记的。2.6就必须用EXPORT_SYMBOL() 来导出来&#xff08;因为2.6默认不到处所有的符号&#xff09;。 1、EXPORT_SYMBOL的…

技术人写作和写代码一样重要

也许当你老了会发出这样的感叹“曾经有无数条发财致富的道路摆在我面前&#xff0c;我不知道珍惜&#xff0c;现在老了才追悔莫及”。写技术文章无疑是做技术人工作之外一条很好的知识变现之路。而我也才最近顿悟&#xff0c;下定决心开始在coding的闲暇时间围绕自己的工作和兴…

ejb jsf jpa_完整的WebApplication JSF EJB JPA JAAS –第1部分

ejb jsf jpa这篇文章将是迄今为止我博客中最大的一篇文章&#xff01; 我们将看到完整的Web应用程序。 最新的技术&#xff08;直到今天&#xff09;都将完成&#xff0c;但是我将给出一些提示以显示如何使本文章适应较旧的技术。 在本文的结尾&#xff0c;您将找到要下载的源代…

Jzoj4782 Math

若一个数x是平方数&#xff0c;则d(x)为平方数 所以就是要考虑有多少对i*j为平方数 我们假设&#xff0c;ip*k^2&#xff0c;那么&#xff0c;jp*q^2时&#xff0c;i*j为平方数&#xff08;p不含平方因子&#xff0c;k&#xff0c;q为正整数&#xff09; 所以&#xff0c;我们对…

前端暗黑模式,你了解多少

关于使用越来越多的前端暗黑模式&#xff0c;手机的app或网站都将支持暗黑模式逐渐成为一种规范&#xff0c;这样做的目的是什么呢&#xff1f;从我最初的理解是为了在黑暗的环境下屏幕上阅读的体验考虑&#xff0c;但是看了文摘却有另一种意义。暗黑模式究竟能不能起到省电的作…

两全其美的

使用抽象文档模式的类型安全视图 您如何组织对象&#xff1f; 在本文中&#xff0c;我将介绍一种模式&#xff0c;该模式以无类型的方式在您的系统中组织所谓的名词类&#xff0c;然后使用特征公开数据的类型化视图。 这使得只需少量的牺牲就可以在Java之类的语言中获得JavaScr…

Windows内核函数

字符串处理 在驱动中一般使用的是ANSI字符串和宽字节字符串&#xff0c;在驱动中我们仍然可以使用C中提供的字符串操作函数&#xff0c;但是在DDK中不提倡这样做&#xff0c;由于C函数容易导致缓冲区溢出漏洞&#xff0c;针对字符串的操作它提供了一组函数分别用来处理ANSI字符…

前端应该关注的2021年UI设计趋势

UI设计趋势几乎每年都在发生变化&#xff0c;变化的原因是人们的审美在变导致的&#xff0c;还是设计越来越人性化。市场上是谁在主导设计趋势&#xff1f;其中原因不得而知&#xff0c;我们先看看究竟有哪些变化&#xff1a;1. 3D插图&#xff08;依然流行&#xff09;3D图像将…