Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >axios 拦截器实现原理

axios 拦截器实现原理

作者头像
蓓蕾心晴
发布于 2024-05-07 01:10:03
发布于 2024-05-07 01:10:03
66000
代码可运行
举报
文章被收录于专栏:前端小叙前端小叙
运行总次数:0
代码可运行

Axios 是一个基于 Promise 的 HTTP 客户端,用于在浏览器和 node.js 中执行 HTTP 请求。它具备拦截请求和响应的能力,这使得开发者可以在请求被发送到服务器前或响应被传递给 then/catch 方法前,对其进行处理或修改。拦截器是 Axios 非常强大的特性之一,它们主要被用于日志记录、身份验证、如果请求失败时的重试机制等功能;允许你在请求发送到服务器之前或响应返回客户端之前对其进行修改或处理。

拦截器主要有两种:请求拦截器(request interceptors)和响应拦截器(response interceptors)。

请求拦截器:

  • 请求拦截器在发送请求之前被调用。
  • 它可以修改请求的配置,如 headers、url、params 等。
  • 也可以在此阶段取消请求。
  • 请求拦截器的修改或添加的配置将被用于之后的请求发送。

响应拦截器:

  • 响应拦截器在服务器的响应被 Axios 处理之前被调用。
  • 它可以修改响应数据,处理错误等。
  • 如果响应是一个正常的响应,可以直接返回数据或对数据进行修改。
  • 如果响应是一个错误(例如,404或500状态码),可以进行错误处理或重试逻辑。

实现原理

  1. 拦截器数组: Axios 内部维护了两个数组,一个用于存储请求拦截器,另一个用于存储响应拦截器。每个拦截器都是一个函数,这些函数按照它们在数组中定义的顺序被依次执行。
  2. 拦截器函数的参数:
    • 请求拦截器:通常接收一个配置对象(通常是请求的配置)作为参数,并返回一个配置对象或 Promise。
    • 响应拦截器:接收一个响应对象作为参数,并返回一个响应对象或 Promise。
  3. 拦截器的执行:
    • 当 Axios 发起一个请求时,它会首先遍历并执行请求拦截器数组中的每个函数。这些函数可以对请求进行预处理,比如添加请求头、处理错误等。
    • 一旦请求被发送并得到响应,Axios 会遍历并执行响应拦截器数组中的每个函数。这些函数可以对响应进行后处理,比如数据转换、错误处理等。
    • 当发出请求或接收响应时,Axios 会遍历这些拦截器,并按照添加的顺序执行请求拦截器,以及按照相反的顺序执行响应拦截器。
    • 在 Axios 的源码中,拦截器是通过一个 AxiosInterceptorManager 实例来管理的,它维护了一个拦截器数组。每个拦截器都是一个包含 fulfilledrejected 函数的对象。这两个函数分别对应于拦截器成功处理和拦截器处理出错的情况。
  4. Promise 链: 由于拦截器函数可以返回 Promise,因此可以很容易地在拦截器中执行异步操作。Axios 会等待每个拦截器的 Promise 解决后再继续执行后续的拦截器或请求/响应处理。
  5. 取消拦截器: Axios 提供了取消拦截器的方法,允许你在不再需要某个拦截器时将其从数组中移除。
  6. 使用场景:
    • 身份验证或添加通用 headers:在请求拦截器中添加身份验证令牌(token)。
    • 性能监控:记录请求的延迟时间。
    • 错误处理:在响应拦截器中统一处理网络错误或服务器错误。
    • 数据转换:在响应拦截器中处理服务器返回的数据,比如解析 JSON 数据或进行其他格式转换。
    • 日志记录:在请求和响应拦截器中记录请求的详细信息,以便进行调试或监控。

示例代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 添加请求拦截器  
axios.interceptors.request.use(function (config) {  
  // 在发送请求之前做些什么  
  return config;  
}, function (error) {  
  // 对请求错误做些什么  
  return Promise.reject(error);  
});  
  
// 添加响应拦截器  
axios.interceptors.response.use(function (response) {  
  // 对响应数据做点什么  
  return response;  
}, function (error) {  
  // 对响应错误做点什么  
  return Promise.reject(error);  
});

以下是 Axios 拦截器管理器的一个简化版本,展示了其核心实现思路:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class InterceptorManager {
  constructor() {
    this.handlers = []; // 存储拦截器的数组
  }

  use(fulfilled, rejected) {
    this.handlers.push({
      fulfilled: fulfilled,
      rejected: rejected
    });
    return this.handlers.length - 1; // 返回拦截器的ID
  }

  eject(id) {
    if (this.handlers[id]) {
      this.handlers[id] = null; // 移除拦截器
    }
  }

  forEach(fn) {
    this.handlers.forEach((h) => {
      if (h !== null) {
        fn(h);
      }
    });
  }
}

在发送请求或接收响应时,Axios 会创建一个 promise 链,并通过 forEach 方法将拦截器中的 fulfilledrejected 函数添加到这个链中。这样,每个拦截器都可以对请求或响应进行处理,然后将结果传递到链的下一个拦截器,或者在出错时结束链的执行。

注意事项

  • 拦截器是按顺序执行的,因此它们的顺序很重要。
  • 由于拦截器可以修改请求或响应数据,因此在使用它们时要特别小心,确保不要意外地修改了你不需要修改的数据。
  • 如果在拦截器中抛出了错误或返回了一个被拒绝的 Promise,那么后续的拦截器和请求/响应处理将不会被执行。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
axios 如何设计拦截器
最近在做axios的二次封装,在配置拦截器时。发现实际的调用流程与预想的不太一致。所以去看了看axios拦截器部分的源码,大概了解拦截器的实现。 一下是对拦截器实现的一些理解。
copy_left
2022/03/23
7660
面试官:你了解Axios的原理吗?有看过它的源码吗?
实现axios.interceptors.response.use和axios.interceptors.request.use
@超人
2021/02/26
3.4K0
面试官:你了解Axios的原理吗?有看过它的源码吗?
Koa的洋葱中间件,Redux的中间件,Axios的拦截器,一个精简版的就彻底搞懂了。
前端中的库很多,开发这些库的作者会尽可能的覆盖到大家在业务中千奇百怪的需求,但是总有无法预料到的,所以优秀的库就需要提供一种机制,让开发者可以干预插件中间的一些环节,从而完成自己的一些需求。
ssh_晨曦时梦见兮
2020/04/11
2.1K0
Koa的洋葱中间件,Redux的中间件,Axios的拦截器,一个精简版的就彻底搞懂了。
【秒懂】axios拦截器模式简单实现
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。 今天这里主要是拦截器这里做一些分析,并且自动动手实现一个简化版本的便于理解。
老码小张
2021/09/05
2.6K0
一比一还原axios源码(五)—— 拦截器
  上一篇,我们扩展了Axios,构建了一个Axios类,然后通过这个Axios工厂类,创建真正的axios实例。那么今天,我们来实现下Axios的拦截器也就是interceptors。我们来简单看下Axios的interceptors的API:
zaking
2022/05/10
8550
一比一还原axios源码(五)—— 拦截器
HTTP 请求库 - Axios 源码分析
说到 JS HTTP 请求,就不得不提 Axios,作为前端网络请求库领域中的霸主,被广泛应用于众多的 web 项目中。
@超人
2021/09/17
2.3K0
HTTP 请求库 - Axios 源码分析
深入解析axios原理及源码探究
在上一篇文章中,我们简要介绍了axios的基本使用方法。这里,我们将再次回顾一下关键点:
全栈若城
2024/10/15
2270
搞明白axios 源码,探究配置、拦截器、适配器等核心功能具体的执行过程(二)
上一节我们简单的介绍了一下 axios 的整体加载流程和使用过程。可以清楚的了解到当 import axios from 'axios' 之后 这背后到底做了什么。并且我们也简单介绍了一个 axios 到底是一个什么类型的数据。以及为什么可以即可以当成方法调用还可以通过对象的调用方式调用某些属性方法
用户9078190
2022/10/28
1.3K0
搞明白axios 源码,探究配置、拦截器、适配器等核心功能具体的执行过程(二)
【前端探索】告别烂代码!用责任链模式封装网络请求
用vue开发web页面的时候,axios几乎是必选的网络框架,我们有时候需要在请求发出前和收到响应后,对数据做一些处理,这时候就会用到axios的拦截器,如果拦截器中我们需要处理的逻辑太过复杂,有什么方案可以优化么?
luciozhang
2023/04/22
6160
【前端探索】告别烂代码!用责任链模式封装网络请求
axios 二次封装-拦截器队列
查看axios的源码,会发现拦截器是由简单数组实现,挂载use eject 方法。拦截器注册的Id实际就是数组的编号,实现的核心在request调用前的拦截器队列编排上。满足平常开发,如果想做扩展就有些限制,所以这里希望通过提供一个自定义的拦截器中间层。提供些扩展功能。
copy_left
2022/04/02
5510
你还不知道Axios中间件怎么实现吗?
Axios 是用于发送 HTTP 请求的一个 JavaScript 库。中间件事一种机制,可以在请求和响应过程中添加自定义逻辑。也可以理解成插件化的一种机制,可以在代码执行过程中穿插一部分自定义逻辑。
can4hou6joeng4
2023/11/29
4360
Axios入门与源码解析
(1) 需求: 项目中有部分接口需要的配置与另一部分接口需要的配置不太一样, 如何处理
鱼找水需要时间
2023/02/16
3.2K0
Axios入门与源码解析
axios进阶之路——拦截器篇
一般在使用axios时,会用到拦截器的功能,一般分为两种:请求拦截器、 响应拦截器。
流眸
2020/05/20
1.9K0
基于TypeScript封装Axios笔记(六)
我们希望能对请求的发送和响应做拦截,也就是在发送请求之前和接收到响应之后做一些额外逻辑。
用户7572539
2020/08/26
1.7K0
使用 axios 拦截器解决「 前端并发冲突 」 问题
不同用户在较短时间间隔内变更数据,或者某一个用户进行的重复提交操作都可能导致并发冲突。
皮小蛋
2021/05/08
2.2K0
使用 axios 拦截器解决「 前端并发冲突 」 问题
一文读懂Axios核心源码思想
我们以特性作为入口,解答上述问题的同时一起感受下 Axios 源码极简封装的艺术。
@超人
2021/11/17
9710
如何实现一个HTTP请求库——axios源码阅读与分析
在前端开发过程中,我们经常会遇到需要发送异步请求的情况。而使用一个功能齐全,接口完善的HTTP请求库,能够在很大程度上减少我们的开发成本,提高我们的开发效率。
黄Java
2018/09/18
1.2K0
如何实现一个HTTP请求库——axios源码阅读与分析
axios 是如何封装 HTTP 请求的
前端开发中,经常会遇到发送异步请求的场景。一个功能齐全的 HTTP 请求库可以大大降低我们的开发成本,提高开发效率。
ConardLi
2019/10/14
2.1K0
axios 是如何封装 HTTP 请求的
从源码分析express/koa/redux/axios等中间件的实现方式
在前端比较熟悉的框架如express、koa、redux和axios中,都提供了中间件或拦截器的功能,本文将从源码出发,分析这几个框架中对应中间件的实现原理。
周陆军博客
2023/05/14
2.2K0
大前端领域Middleware有几种实现方式?
Middleware(中间件)本意是指位于服务器的操作系统之上,管理计算资源和网络通信的一种通用独立的系统软件服务程序。分布式应用软件借助这种软件在不同的技术之间共享资源。而在大前端领域,Middleware 的含义则简单得多,一般指提供通用独立功能的数据处理函数。典型的 Middleware 包括日志记录、数据叠加和错误处理等。本文将横向对比大前端领域内各大框架的 Middleware 使用场景和实现原理,包括Express, Koa, Redux和Axios。
Dickensl
2022/06/14
8140
推荐阅读
相关推荐
axios 如何设计拦截器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验