4-封装axios

article/2025/5/11 3:39:09

源码github连接:baojinghui/MyAxios (github.com)

1,为什么要封装axios ,因为当一个库不维护时,便于在封装的地方把不维护的库替换掉

2,因为axios返回的是一个实例对象,所以只能这一个实例上修改。但是我们的接口有两种baseUrl,就可以通过封装,不同的接口创建新的实例去配置,不同实例互不干扰。

3,配置拦截器,给不同的实例配置不同的拦截器,支持以对象形式接受多个拦截器配置

4,一般情况下一个实例就够用了,在大行项目中可以使用到多个实例

目录结构:

类型声明:

/*-------------------------  TS封装拦截器的接口  -------------------------------------*///导入axios的  实例的类型      请求参数的类型      响应数据的类型
import type { AxiosRequestConfig } from 'axios'//扩展拦截器的类型,支持传入一个对象,对象中可同时传入多个回调,可以同时包含响应器和拦截器的配置
export interface MyInterceptors {//请求拦截器和请求拦截器捕获错误的类型resquestInterceptors?: (config: AxiosRequestConfig) => AxiosRequestConfigresquestInterceptorsCatch?: (err: any) => any//响应拦截器和响应拦截器捕获错误的类型responseInterceptors?: (config: any) => any //AxiosResponseresponseInterceptorsCatch?: (err: any) => any
}
//类型扩展,把axios上的类型,扩展到自己定义的接口上,使请求参数支持传入一个对象
export interface MyRequestConfig extends AxiosRequestConfig {interceptors?: MyInterceptors //扩展后的拦截器showLoading?: boolean //是否显示加载动画
}

 基于axios封装的类:

//封装一个axios的类,每次使用时生成一个新的实例,这样配置多种不同服务器请求的接口
import axios from 'axios'
//导入axios的  实例的类型
import type { AxiosInstance } from 'axios'
//导入扩展后的接口类型 和扩展后的请求参数类型
import type { MyInterceptors, MyRequestConfig } from './types'
//导入请求动画组件
import { ElLoading } from 'element-plus'
// 导入请求动画实例的类型,用于取消动画
import { LoadingInstance } from 'element-plus/lib/components/loading/src/loading'
//封装axios
class MyAxios {instance: AxiosInstance //实例interceptors?: MyInterceptors //拦截器loading?: LoadingInstance //加载动画showLoading?: boolean //是否显示请求的动画//config的类型改为加了自己扩展后的类型:AxiosRequestConfig--->MyRequestConfig,//上面会增加interceptors接口,支持同时传入多个拦截器,和接受是否显示动画的配置constructor(config: MyRequestConfig) {//每次调用instance都会产生一个新的实例,在新的实例上面配置新的baseurl等配置this.instance = axios.create(config)//保存一份传入的所有拦截器this.interceptors = config.interceptors//默认显示请求动画:showLoading默认为truethis.showLoading = config.showLoading ?? true//使用实例身上的请求拦截器和响应拦截器的方法,把传入拦截器对象中的方法依次传入this.instance.interceptors.request.use(this.interceptors?.resquestInterceptors,this.interceptors?.resquestInterceptorsCatch)this.instance.interceptors.response.use(this.interceptors?.responseInterceptors,this.interceptors?.responseInterceptorsCatch)//但是有些拦截器配置每个实例都会需要,//如请求时的动画,需要全局配置,让每个实例中都存在,就直接使用axios上面的拦截器进行封装this.instance.interceptors.request.use((config) => {console.log('全局拦截成功')//全局配置loading动画,拿下loadingif (this.showLoading)this.loading = ElLoading.service({lock: true,text: '正在加载...',background: 'rgba(0,0,0,0.5)',})return config},(err) => {console.log('全局拦截失败')return err})this.instance.interceptors.response.use((res) => {setTimeout(() => {this.loading?.close()}, 1000)console.log('全局响应成功')const data = res.dataif (data.returnCode == '-1001') {console.log('请求失败')} else {return data}},(err) => {console.log('全局响应失败')this.loading?.close() //移除加载动画if (err.response.status === 404) {console.log('404错误信息')}return err})}//封装request请求//请求参数config要用自己扩展后的接口(MyRequestConfig),才支持传入对象形式的拦截器request<T>(config: MyRequestConfig): Promise<T> {return new Promise((resolve, resject) => {//还可以给单个请求配置拦截器if (config.interceptors?.resquestInterceptors) {//如果存在说明配置了单个请求的拦截器,就把转换后的config返回给config继续处理//config.interceptors.resquestInterceptors(config)返回的是一个处理过后的configconfig = config.interceptors.resquestInterceptors(config)}//请求动画默认false,如果showloading为false,就是关闭请求动画if (config.showLoading === false) {this.showLoading = config.showLoading}//使用axios自身的request发请求this.instance.request<any, T>(config).then((res) => {//如果为真说明配置了单个请求的响应拦截器,就把转换后的res返回给res继续处理//config.interceptors.resquestInterceptors(res)返回的是一个处理过后的resif (config.interceptors?.responseInterceptors) {res = config.interceptors.responseInterceptors(res)}//让动画显示,即使上面不显示动画的请求完也设置,这样不影响后面的动画显示this.showLoading = trueresolve(res)}).catch((err) => {this.showLoading = trueresject(err)})})}//封装get请求,就是再get内部调requestget<T>(config: MyRequestConfig): Promise<T> {return this.request<T>({ ...config, method: 'GET' })}//封装post请求,就是再post内部调requestpost<T>(config: MyRequestConfig): Promise<T> {return this.request<T>({ ...config, method: 'GET' })}//封装delete请求,就是再delete内部调requestdelete<T>(config: MyRequestConfig): Promise<T> {return this.request<T>({ ...config, method: 'GET' })}//封装patch请求,就是再patch内部调requestpatch<T>(config: MyRequestConfig): Promise<T> {return this.request<T>({ ...config, method: 'GET' })}
}
export default MyAxios

创建实例:

//配置MyAxios的实例并导出
import MyAxios from './request/index' //导入axios
import { BASE_URL, TIME_OUT } from '@/service/request/config' //导入环境变量
const myAxios = new MyAxios({baseURL: BASE_URL,timeout: TIME_OUT,//可选,单个实例的拦截器interceptors: {resquestInterceptors(config) {console.log('实例请求拦截成功')return config},resquestInterceptorsCatch(err) {console.log('实例请求拦截失败')return err},responseInterceptors(res) {console.log('实例响应拦截成功')return res},responseInterceptorsCatch(err) {console.log('实例请求拦截失败')return err},},
})
//导出封装的实例
export default myAxios

发送请求演示:

得到的返回值是我们传入接口的类型

 


http://chatgpt.dhexx.cn/article/upyG0S4S.shtml

相关文章

详解axios(快速入门)

axios这一篇就够啦~ axios1、axios的理解和使用1.1 axios概述1.2 axios特点1.3 axios常用语法1.4 难点语法的理解和使用 2、axios源码分析2.1 源码目录结构2.2 源码分析 axios 1、axios的理解和使用 1.1 axios概述 前端最流行的ajax请求库 react/vue官方都推荐使用axios 发a…

axios快速上手(简单使用)

axios对ajax请求进行了封装&#xff0c;并且使用promise的链式调用使得网络请求的代码逻辑更为清晰&#xff0c;同时支持async和await的编写方式使代码看起来像同步&#xff0c;更加方便于理解和阅读。axios这个库的体积也不大&#xff0c;先在项目里进行安装&#xff0c;npm i…

numpy的使用说明(六):一招帮你彻底搞懂axis=0和axis=1

1、关于axis轴的说明 思考&#xff1a;给你一个三维数组&#xff0c;你知道如何设置axis轴的值吗&#xff1f;下面这张图展示的结果你知道怎么来的吗&#xff1f;这些疑问都会在文中给你一一解答。 2、什么是维度&#xff1f; 举例说明 3、什么是高维&#xff0c;什么是低维…

axios(1)

json-server的介绍与服务搭建 作用 快速创建一个接口&#xff0c;以供Ajax请求 安装及使用 第三步&#xff08;注意路径以及在运行代码前加上npx&#xff09; axios的介绍与页面配置 在项目中 1.$ npm install axios 2.$ yarn add axios 学习阶段使用CDN方式 <scrip…

一文读懂Numpy(Tensorflow)里面的轴(Axis)

目录以及结论 Axis就是数组层级设axisi&#xff0c;则Numpy沿着第i个下标变化的方向进行操作Axis的应用 Axis就是数组层级 要想理解axis&#xff0c;首先我们先要弄清楚“Numpy中数组的维数”和"线性代数中矩阵的维数"这两个概念以及它们之间的关系。在数学或者物…

axios基础(一)

1.封装 最简单的封装&#xff08;这个了解下就行&#xff0c;主要看下下面&#xff09; <button onclick"testPost()">发送POST请求</button><script>function testGet(){axios({url:"https://api.hh2022.cn/main/searchPage/2023/1/5"…

Axios的简单学习(一文上手Axios!)

页内目录 一&#xff0c;Axios的介绍 二&#xff0c;Axios的配置 三&#xff0c;Axios的基本格式 四&#xff0c;使用Axios获取数据 一&#xff0c;Axios的介绍 官方介绍 Axios 是一个基于 promise 的 HTTP 库&#xff0c;可以用在浏览器和 node.js 中&#xff0c;在Vue中官方…

手撕numpy(五):一招帮你彻底搞懂axis=0和axis=1

↑ 关注 星标 ~ 有趣的不像个技术号 每晚九点&#xff0c;我们准时相约 大家好&#xff0c;我是黄同学 手撕numpy系列持续更新中~ 《手撕numpy(一)&#xff1a;简单说明和创建数组的不同方式》 《手撕numpy(二)&#xff1a;各种特性和简单操作》 《手撕numpy(三)&#xff1a…

Tesorflow学习axis=1

Tesorflow学习axis1 cnp.concatenate(a,b,axis0) axiso 跨行 import numpy as np anp.array([[1,2,3],[4,5,6]]) print(a,a) bnp.array([[7,8,9],[10,11,12]]) print(b,b) cnp.concatenate((a,b),axis0) print(c,c)axis1 跨列 cnp.concatenate(a,b,axis1) 参考&#xff1a;htt…

axios(快速入门)

1、axios的理解和使用 1.1 axios的概述 1.前端最流行的ajax请求库 2.react、vue官方都推荐使用axios访问ajax请求 3.文档https://github.com/axios/axios 4.axios中文网axios中文网|axios API 中文文档 | axios (axios-js.com) 1.2 axios的特点 基于xhr promise的异步ajax请求…

pyechart笔记:opts.AxisOpts

定制化图表的轴线&#xff08;x轴和y轴&#xff09;的样式和设置 0 不设置坐标轴 c1(Bar().add_xaxis([力量,智力,敏捷]).add_yaxis(全能骑士,# 系列名称&#xff0c;用于 tooltip 的显示&#xff0c;legend 的图例筛选。[429,321,296],#系列数据).add_yaxis(猴子,[352,236,4…

axios快速上手,详细解读

一、axios的理解 1. axios是什么 前端最流行的 ajax 请求库react/vue 官方都推荐使用 axios 发 ajax 请求axios文档 2. axios的特点 基于 xhr promise 的异步 ajax 请求库浏览器端/node 端都可以使用支持请求&#xff0f;响应拦截器支持请求取消请求/响应数据转换批量发送…

Micropython——使用匿名上位机工作站实现电机参数实时绘图并PID调参

感谢龙哥指导使用如此优秀的上位机调参软件快速实现基于pyb开发的机器人PID参数的调节整定。 匿名工作站上位机简介 【经验篇】匿名上位机4.34简单上手 使用匿名工作站上位机可以快速完成对机器人底盘电机的PID参数整定&#xff0c;而且绘图速度极快&#xff0c;基本无延时&a…

axios--》axios初步操作

目录 初识axios axios常用语法 axios发送get请求 axios发送post请求 axios发送Ajax请求 初识axios axios是一个基于promise的网络请求库&#xff0c;作用于node.js和浏览器中&#xff0c;在服务端它使用原生node.js 的 http 模块&#xff0c;而在客户端(浏览器)则使用 X…

Axios(万字详细教程)

Axios介绍 1、Axios是什么&#xff1f; Axios是一个基于promise的HTTP库&#xff0c;类似于jQuery的ajax&#xff0c;用于http请求。可以应用于浏览器端和node.js&#xff0c;既可以用于客户端&#xff0c;也可以用于node.js编写的服务端。 2、Axios特性 &#xff08;1&…

R语言主成分回归(PCR)、 多元线性回归特征降维分析光谱数据和汽车油耗、性能数据...

原文链接&#xff1a;http://tecdat.cn/?p24152 什么是PCR&#xff1f;&#xff08;PCR PCA MLR&#xff09;&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 • PCR是处理许多 x 变量的回归技术• 给定 Y 和 X 数据&#xff1a;• 在 X 矩阵上进行 PCA– …

ESL3.5 学习笔记(主成分回归,偏最小二乘回归步骤详解)

3.5 运用派生输入方向的方法 这是一篇有关《统计学习基础》&#xff0c;原书名The Elements of Statistical Learning的学习笔记&#xff0c;该书学习难度较高&#xff0c;有很棒的学者将其翻译成中文并放在自己的个人网站上&#xff0c;翻译质量非常高&#xff0c;本博客中有…

R语言高维数据惩罚回归方法:主成分回归PCR、岭回归、lasso、弹性网络elastic net分析基因数据

最近我们被客户要求撰写关于高维数据惩罚回归的研究报告&#xff0c;包括一些图形和统计输出。 主成分分析PCA降维方法和R语言分析葡萄酒可视化实例 主成分分析PCA降维方法和R语言分析葡萄酒可视化实例 &#xff0c;时长04:30 1 介绍 在本文中&#xff0c;我们将研究以下主题…

回归预测 | MATLAB实现PCR(主成分回归)多输入单输出

回归预测 | MATLAB实现PCR(主成分回归)多输入单输出(PCA Regression) MATLAB实现数据降维的PCA(主成分分析)函数有pca和pcacov两个。 pca函数可以直接利用原始数据进行主成分分析; pcacov函数针对原始数据的协方差矩阵进行主成分分析,本程序实现了两种分析方法的预测结果对比…

Python数据分析案例22——财经新闻可信度分析(线性回归,主成分回归,随机森林回归)

本次案例还是适合人文社科领域&#xff0c;金融或者新闻专业。本科生做线性回归和主成分回归就够了&#xff0c;研究生还可以加随机森林回归&#xff0c;其方法足够人文社科领域的硕士毕业论文了。 案例背景 有八个自变量&#xff0c;[微博平台可信度,专业性,可信赖性,转发量,…