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

axios二次封装-单个、特定的实例的拦截器、所有实例的拦截器。

src/service/request/type.ts
import type { AxiosRequestConfig, AxiosResponse } from 'axios'// 针对AxiosRequestConfig配置进行扩展
export interface HYInterceptors<T = AxiosResponse> {requestSuccessFn?: (config: AxiosRequestConfig) => AxiosRequestConfigrequestFailureFn?: (err: any) => anyresponseSuccessFn?: (res: T) => TresponseFailureFn?: (err: any) => any
}export interface HYRequestConfig<T = AxiosResponse> extends AxiosRequestConfig {interceptors?: HYInterceptors<T>
}
import axios from 'axios'
import type { AxiosInstance } from 'axios'
import type { HYRequestConfig } from './type'// 拦截器: 蒙版Loading/token/修改配置/*** 两个难点:*  1.拦截器进行精细控制*    > 全局拦截器*    > 实例拦截器*    > 单次请求拦截器**  2.响应结果的类型处理(泛型)*/class HYRequest {instance: AxiosInstance// request实例 => axios的实例constructor(config: HYRequestConfig) {this.instance = axios.create(config)// 为所有的instance实例都添加拦截器this.instance.interceptors.request.use((config) => {// 可以添加: loading/token/headersreturn config},(err) => {return err})this.instance.interceptors.response.use((res) => {return res.data},(err) => {return err})// 针对特定的hyRequest实例添加拦截器this.instance.interceptors.request.use(config.interceptors?.requestSuccessFn,config.interceptors?.requestFailureFn)this.instance.interceptors.response.use(config.interceptors?.responseSuccessFn,config.interceptors?.responseFailureFn)}// 封装网络请求的方法// T => IHomeDatarequest<T = any>(config: HYRequestConfig<T>) {// 单次请求的成功拦截处理, 单个请求的拦截器,需要自己手动调用,拦截的本质就是在特定的时候调用,请求拦截器,就是在发送网络请求之前调用。响应拦截器就是在得到后端的结果返回到前台前调用if (config.interceptors?.requestSuccessFn) {config = config.interceptors.requestSuccessFn(config)}// 返回Promisereturn new Promise<T>((resolve, reject) => {this.instance.request<any, T>(config).then((res) => {// 单词响应的成功拦截处理if (config.interceptors?.responseSuccessFn) {// 重新指定响应结果res = config.interceptors.responseSuccessFn(res)}resolve(res)}).catch((err) => {reject(err)})})}get<T = any>(config: HYRequestConfig<T>) {return this.request({ ...config, method: 'GET' })}post<T = any>(config: HYRequestConfig<T>) {return this.request({ ...config, method: 'POST' })}delete<T = any>(config: HYRequestConfig<T>) {return this.request({ ...config, method: 'DELETE' })}patch<T = any>(config: HYRequestConfig<T>) {return this.request({ ...config, method: 'PATCH' })}
}export default HYRequest
src/service/index.ts
import { BASE_URL, TIME_OUT } from './config'
import HYRequest from './request'const hyRequest = new HYRequest({baseURL: BASE_URL,timeout: TIME_OUT,
})
const hyRequest2 = new HYRequest({baseURL: BASE_URL,timeout: TIME_OUT,// 针对hyRequest2实例的特定的请求拦截interceptors: {requestSuccessFn: (config) => {return config}}
})export { hyRequest, hyRequest2}
src/service/modules/login.tsimport hyRequest from '..'
export function accountLogin(account: any) {return hyRequest.post({url: '/login',data: account,// 单个请求的拦截器编写位置interceptors:{// 请求成功的拦截器回调responseSuccessFn(config){return config}}})
}

请求拦截器可以编写多个。执行顺序于编写顺序有关,越早编写。请求拦截器就越先执行。响应拦截器的执行顺序与请求拦截器的执行顺序相反

拦截器知识点介绍
// 一般在使用axios时,会用到拦截器的功能,一般分为两种:请求拦截器、响应拦截器。
// 请求拦截器
//   在请求发送前进行必要操作处理,例如添加统一cookie、请求体加验证、设置请求头等,相当于是对每个接口里相同操作的一个封装;
// 响应拦截器
//   同理,响应拦截器也是如此功能,只是在请求得到响应之后,对响应体的一些处理,通常是数据统一处理等,也常来判断登录失效等。// 配置全局请求拦截器
// 请求拦截器就是对config进行操作的,然后返回新的config
// axios.interceptors.request.use(请求成功的拦截回调函数,请求失败的拦截回调函数)
axios.interceptors.request.use((config) => {//config是请求时的配置信息,里面包含很多关于请求的信息// config.url 请求地址、config.headers.xxx = yyy 添加请求头// 请求拦截的常用操作// 可以对原来的配置进行一些修改:// 1. header// 2. 认证登录: token/cookie// 3. 请求参数进行某些转化// 举例:// 看一下哪些请求需要验证token,哪些不需要// 通过配置文件配置白名单(不需要验证)const whiteListApi = ["/a", "/b"]// TOEKN存在于localstorage中// 获取请求地址:config.urlif (!whiteListApi.includes(config.url)) {// 需要验证token} else {}// 也可以设置 发送请求时的等待loading动画console.log("请求成功的拦截")return config},(err) => {console.log("请求失败的拦截")return err}
)// 配置全局响应拦截器
// 响应拦截器就是对res进行操作的, 然后返回新的res
// axios.interceptors.response.use(请求成功的拦截回调函数,请求失败的拦截回调函数)
axios.interceptors.response.use((res) => {// res是请求获得的结果// 响应拦截的常用操作:// 可以对res数据进行处理, 再返回数据// 也可以设置请求结束loading动画console.log("响应成功的拦截")return res.data},(err) => {console.log("响应失败的拦截:", err)return err}
)axios.get("http://123.207.32.32:9001/lyric?id=500665346").then((res) => {console.log("res:", res)}).catch((err) => {console.log("err:", err)})
封装axiosd的必要性
import axios from "axios"
// axios就是axios库默认提供给我们的实例对象
// axios.defaults.xxx  设置的式全局配置,对于所有的axios实例都可见// 每个实例都是单独, 不会与其他的axios实例的配置(baseURL,TIMEOUT、headers)发生冲突
// 每个实例对象的配置可以设置不同,互不干扰
// const axios实例对象 = axios.create({单独的配置})
const instance1 = axios.create({baseURL: "http://123.207.32.32:9001",timeout: 6000,headers: {}
})const instance2 = axios.create({baseURL: "http://123.207.32.32:8000",timeout: 10000,headers: {}
})// 使用实例1发生请求
instance1.get("/lyric", {params: {id: 500665346}
}).then(res => {console.log("res:", res.data)
})
http://www.dtcms.com/a/289020.html

相关文章:

  • 【机器学习深度学习】量化与选择小模型的区别:如何理解两者的优势与局限?
  • 嵌入式硬件篇---核心板制作
  • nginx定期清理日志
  • 【面向对象】C++类实现计数器:从理论到实践的编程之旅
  • RK3588 编译 Android 13 镜像方法
  • 基于有监督学习的主动攻击检测系统
  • Softhub软件下载站实战开发(十九):软件信息展示
  • MCP与智能问数技术全面指南:从协议设计到智能化数据查询
  • Flink高频考点:Checkpoint与Savepoint的高可用实战指南
  • 购物--贪心例题
  • LLM指纹底层技术——噪声鲁棒性机制
  • 英伟达:拓展LLM训练过程
  • Day1||Vue指令学习
  • 小红书 MCP 服务器
  • MLA:KV Cache 的“低秩跃迁”
  • Android 项目中如何在执行 assemble 或 Run 前自动执行 clean 操作?
  • 7.19-7.20 Java基础 | File类 I/O流学习笔记
  • Python 单例模式几种实现方式
  • 【AI】模型接入初始化(Lanchain4j)
  • Effective Python 条款13:通过带星号的unpacking操作来捕获多个元素,不要用切片
  • 第十八节:第六部分:java高级:注解、自定义注解、元注解
  • 响应式编程入门教程第八节:UniRX性能分析与优化
  • BIOS+MBR微内核加载loader程序实现过程
  • 从零开始开发纯血鸿蒙应用之跨模块路由
  • 编程语言Java入门——核心技术篇(一)封装、继承和多态
  • 【图文详解】Transformer架构详细解析:多头自注意力机制、qkv计算过程、encoder架构、decoder架构以及mask的意义
  • Request和Response相关介绍
  • 假如只给物品编号和物品名称,怎么拆分为树形结构(拆出父级id和祖籍列表),用于存储具有层级关系的数据。
  • 高效培养AI代理的全能工具:Agent Reinforcement Trainer
  • Windows CMD(命令提示符)中最常用的命令汇总和实战示例