HOW - Axios 拦截器特性

目录

  • Axios 介绍
  • 拦截器特性
    • 1. 统一添加 Token(请求拦截器)
    • 2. 处理 401 未授权(响应拦截器)
    • 3. 统一处理错误信息(响应拦截器)
    • 4. 请求 Loading 状态管理
    • 5. 自动重试请求(如 429 过载)
    • 6. 数据格式转换(响应拦截器)
    • 7. 记录请求日志(请求拦截器 + 响应拦截器)
    • 总结
    • 结论

Axios 介绍

Axios 是基于 XMLHttpRequest(XHR)Promise 进行封装的 HTTP 客户端。

它的核心实现依赖于以下技术:

  1. XMLHttpRequest(XHR)

    • 在浏览器环境下,Axios 使用 XMLHttpRequest 发送 HTTP 请求,并基于它进行封装,提供更简洁的 API 和更好的错误处理机制。
    • 例如,它支持请求和响应的拦截器、超时设置、请求取消等功能,而这些都需要额外的封装才能在 XMLHttpRequest 中实现。
  2. Node.js 的 http 模块

    • 在 Node.js 环境下,Axios 使用 httphttps 模块代替 XMLHttpRequest 发送 HTTP 请求,从而实现跨环境的兼容性。
  3. Promise

    • Axios 的 API 是基于 Promise 设计的,所有请求都会返回一个 Promise,支持 async/await,比传统的 XMLHttpRequest 更加方便。
  4. 拦截器(Interceptors)

    • 通过 requestresponse 拦截器,Axios 允许在请求或响应到达应用程序之前,对其进行修改,比如添加请求头、处理错误、全局 loading 等。
  5. 取消请求(Cancel Token)

    • 依赖 AbortController 或者 CancelToken(Axios 0.x 版本提供),可以在特定条件下取消未完成的 HTTP 请求。
  6. 自动 JSON 解析

    • Axios 默认会将 JSON 响应数据自动解析成 JavaScript 对象,而 XMLHttpRequest 需要手动解析。
  7. 并发请求管理

    • 通过 axios.all()axios.spread(),支持并行发送多个请求,并在所有请求完成后进行处理。

总结来说,Axios 的底层实现主要基于 XMLHttpRequest(浏览器端)或 Node.js http 模块(服务端),同时结合 Promise、拦截器、取消请求等高级特性,提供了比原生 API 更易用的 HTTP 请求功能。

拦截器特性

Axios 拦截器(Interceptors)可以在请求发送前或响应返回后进行处理,常用于全局请求配置、错误处理、权限校验、自动重试等场景。以下是几个实际应用示例:

1. 统一添加 Token(请求拦截器)

场景:
需要在所有请求的 headers 中添加 Authorization 头部,例如 JWT Token。

import axios from "axios";// 创建 axios 实例
const api = axios.create({baseURL: "https://api.example.com",timeout: 5000,
});// 请求拦截器
api.interceptors.request.use(config => {const token = localStorage.getItem("token"); // 从本地存储获取 tokenif (token) {config.headers.Authorization = `Bearer ${token}`; // 设置 Authorization 头部}return config;},error => Promise.reject(error)
);// 使用 axios 实例
api.get("/user/profile").then(response => console.log(response.data));

📌 效果:

  • 所有请求都会自动附带 Authorization 头部,避免手动在每个请求中添加。

2. 处理 401 未授权(响应拦截器)

场景:
当后端返回 401 Unauthorized,表示 Token 失效,应该自动跳转到登录页。

api.interceptors.response.use(response => response,error => {if (error.response?.status === 401) {console.error("身份认证失败,跳转到登录页...");window.location.href = "/login"; // 重定向到登录页面}return Promise.reject(error);}
);

📌 效果:

  • 如果请求返回 401,用户会被自动跳转到登录页,而不会继续执行后续逻辑。

3. 统一处理错误信息(响应拦截器)

场景:
后端返回错误时,拦截器可以解析 error.response.data,并弹出错误提示。

import { message } from "antd"; // 适用于 Ant Design 的 message 组件api.interceptors.response.use(response => response,error => {if (error.response) {const { status, data } = error.response;const errorMsg = data.message || "服务器错误";message.error(`请求失败 (${status}): ${errorMsg}`);} else {message.error("网络异常,请检查你的连接");}return Promise.reject(error);}
);

📌 效果:

  • 400、500 等错误时,自动弹出友好的错误提示。

4. 请求 Loading 状态管理

场景:
在请求发起时显示 Loading 状态,请求结束后自动隐藏。

import { message } from "antd";let requestCount = 0;function showLoading() {if (requestCount === 0) {message.loading("加载中...", 0);}requestCount++;
}function hideLoading() {requestCount--;if (requestCount === 0) {message.destroy(); // 关闭 loading}
}// 请求拦截器:增加 Loading
api.interceptors.request.use(config => {showLoading();return config;
});// 响应拦截器:移除 Loading
api.interceptors.response.use(response => {hideLoading();return response;},error => {hideLoading();return Promise.reject(error);}
);

📌 效果:

  • 多个请求时,只显示一个 Loading,所有请求完成后才关闭。

5. 自动重试请求(如 429 过载)

场景:
如果服务器返回 429 Too Many Requests,可以实现自动重试,避免短时间内请求失败。

api.interceptors.response.use(response => response,async error => {const { response, config } = error;if (response?.status === 429 && !config.__isRetryRequest) {config.__isRetryRequest = true;console.warn("请求过载,2 秒后重试...");await new Promise(resolve => setTimeout(resolve, 2000));return api(config); // 重新请求}return Promise.reject(error);}
);

📌 效果:

  • 如果服务器返回 429,拦截器会等待 2 秒后自动重试一次。

6. 数据格式转换(响应拦截器)

场景:
后端返回的数据格式不符合前端要求,需要在拦截器中转换。

api.interceptors.response.use(response => {if (response.data && response.data.result) {return response.data.result; // 提取需要的 `result` 数据}return response.data;
});

📌 效果:

  • 假设后端返回 { success: true, result: { name: "Tom" } },前端直接拿到 { name: "Tom" }

7. 记录请求日志(请求拦截器 + 响应拦截器)

场景:
在开发模式下,打印请求和响应日志,方便调试。

api.interceptors.request.use(config => {console.log("🚀 请求:", config.method?.toUpperCase(), config.url, config.data);return config;
});api.interceptors.response.use(response => {console.log("✅ 响应:", response.config.url, response.data);return response;},error => {console.error("❌ 请求失败:", error.config?.url, error.response?.status);return Promise.reject(error);}
);

📌 效果:

  • 在开发者工具控制台中,能看到请求和响应的日志信息,方便调试。

总结

拦截器类型应用场景**示例代码
请求拦截器统一添加 Tokenconfig.headers.Authorization = Bearer ${token}
请求拦截器全局 Loading 处理showLoading()hideLoading()
响应拦截器处理 401 未授权if (error.response.status === 401) { window.location.href = "/login"; }
响应拦截器统一错误提示message.error(error.response.data.message);
响应拦截器处理 429 过载自动重试await new Promise(resolve => setTimeout(resolve, 2000)); return api(config);
响应拦截器数据格式转换return response.data.result;
拦截器请求 & 响应日志console.log("🚀 请求:", config)

结论

Axios 拦截器非常强大,能帮助我们在全局范围内 统一管理请求和响应,减少重复代码,提升可维护性。实际项目中,可以根据需求选择合适的拦截器组合,提升开发效率!

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

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

相关文章

JVM核心机制:类加载×字节码引擎×垃圾回收机制

🚀前言 “为什么你的Spring应用启动慢?为什么GC总是突然卡顿?答案藏在JVM的核心机制里! 本文将用全流程图解字节码案例,带你穿透三大核心机制: 类加载:双亲委派如何防止恶意代码入侵&#xff…

coze生成流程图和思维导图工作流

需求:通过coze平台实现生成流程图和思维导图,要求支持文档上传 最终工作流如下: 入参: 整合用户需求文件内容的工作流:https://blog.csdn.net/YXWik/article/details/147040071 选择器分发,不同的类型走…

网络安全应急响应-文件痕迹排查

在Windows系统的网络安全应急响应中&#xff0c;文件痕迹排查是识别攻击行为的关键步骤。以下是针对敏感目录的详细排查指南及扩展建议&#xff1a; 1. 临时目录排查&#xff08;Temp/Tmp&#xff09; 路径示例&#xff1a; C:\Windows\TempC:\Users\<用户名>\AppData\L…

SpringBoot集成Redis 灵活使用 TypedTuple 和 DefaultTypedTuple 实现 Redis ZSet 的复杂操作

以下是 Spring Boot 集成 Redis 中 TypedTuple 和 DefaultTypedTuple 的详细使用说明&#xff0c;包含代码示例和场景说明&#xff1a; 1. 什么是 TypedTuple 和 DefaultTypedTuple&#xff1f; TypedTuple<T> 接口&#xff1a; 定义了 Redis 中有序集合&#xff08;ZSet…

递归实现组合型枚举(DFS)

从 1∼n 这 n 个整数中随机选出 m 个&#xff0c;输出所有可能的选择方案。 输入格式 两个整数 n,m,在同一行用空格隔开。 输出格式 按照从小到大的顺序输出所有方案&#xff0c;每行 1 个。 首先&#xff0c;同一行内的数升序排列&#xff0c;相邻两个数用一个空格隔开。…

CentOS 7 镜像源失效解决方案(2025年)

执行 yum update 报错&#xff1a; yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 --skip-broken 已加载插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirror…

vue3 脚手架初始化项目生成文件的介绍

文章目录 一、介绍二、举例说明1.src/http/index.js2.src/router/index.js3.src/router/routes.js4.src/stores/index.js5.src/App.vue6.src/main.js7.babel.config.js8.jsconfig.json9.vue.config.js10. .env11.src/mock/index.js12.src/mock/mock-i18n.js13.src/locales/en.j…

ubuntu 20.04 编译和运行A-LOAM

1.搭建文件目录和clone代码 mkdir -p A-LOAM/src cd A-LOAM/src git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM cd .. 2.修改代码文件 2.1 由于PCL版本1.10&#xff0c;将CMakeLists.txt中的C标准改为14&#xff1a; set(CMAKE_CXX_FLAGS "-stdc14"…

【教程】MacBook 安装 VSCode 并连接远程服务器

目录 需求步骤问题处理 需求 在 Mac 上安装 VSCode&#xff0c;并连接跳板机和服务器。 步骤 Step1&#xff1a;从VSCode官网&#xff08;https://code.visualstudio.com/download&#xff09;下载安装包&#xff1a; Step2&#xff1a;下载完成之后&#xff0c;直接双击就能…

LabVIEW 长期项目开发

LabVIEW 凭借其图形化编程的独特优势&#xff0c;在工业自动化、测试测量等领域得到了广泛应用。对于长期运行、持续迭代的 LabVIEW 项目而言&#xff0c;其开发过程涵盖架构设计、代码管理、性能优化等多个关键环节&#xff0c;每个环节都对项目的成功起着至关重要的作用。下面…

用matlab搭建一个简单的图像分类网络

文章目录 1、数据集准备2、网络搭建3、训练网络4、测试神经网络5、进行预测6、完整代码 1、数据集准备 首先准备一个包含十个数字文件夹的DigitsData&#xff0c;每个数字文件夹里包含1000张对应这个数字的图片&#xff0c;图片的尺寸都是 28281 像素的&#xff0c;如下图所示…

Go 语言语法精讲:从 Java 开发者的视角全面掌握

《Go 语言语法精讲&#xff1a;从 Java 开发者的视角全面掌握》 一、引言1.1 为什么选择 Go&#xff1f;1.2 适合 Java 开发者的原因1.3 本文目标 二、Go 语言环境搭建2.1 安装 Go2.2 推荐 IDE2.3 第一个 Go 程序 三、Go 语言基础语法3.1 变量与常量3.1.1 声明变量3.1.2 常量定…

如何选择优质的安全工具柜:材质、结构与功能的考量

在工业生产和实验室环境中&#xff0c;安全工具柜是必不可少的设备。它不仅承担着工具的存储任务&#xff0c;还直接影响工作环境的安全和效率。那么&#xff0c;如何选择一个优质的安全工具柜呢&#xff1f;关键在于对材质、结构和功能的考量。 01材质&#xff1a;耐用与防腐 …

系统与网络安全------Windows系统安全(11)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 制作U启动盘 U启动程序 下载制作U启程序 Ventoy是一个制作可启动U盘的开源工具&#xff0c;只需要把ISO等类型的文件拷贝到U盘里面就可以启动了 同时支持x86LegacyBIOS、x86_64UEFI模式。 支持Windows、L…

【5】搭建k8s集群系列(二进制部署)之安装master节点组件(kube-controller-manager)

注&#xff1a;承接专栏上一篇文章 一、创建配置文件 cat > /opt/kubernetes/cfg/kube-controller-manager.conf << EOF KUBE_CONTROLLER_MANAGER_OPTS"--logtostderrfalse \\ --v2 \\ --log-dir/opt/kubernetes/logs \\ --leader-electtrue \\ --kubeconfig/op…

C#里第一个WPF程序

WPF程序对界面进行优化,但是比WINFORMS的程序要复杂很多, 并且界面UI基本上不适合拖放,所以需要比较多的时间来布局界面, 产且需要开发人员编写更多的代码。 即使如此,在面对诱人的界面表现, 随着客户对界面的需求提高,还是需要采用这样的方式来实现。 界面的样式采…

createContext+useContext+useReducer组合管理React复杂状态

createContext、useContext 和 useReducer 的组合是 React 中管理全局状态的一种常见模式。这种模式非常适合在不引入第三方状态管理库&#xff08;如 Redux&#xff09;的情况下&#xff0c;管理复杂的全局状态。 以下是一个经典的例子&#xff0c;展示如何使用 createContex…

记一次常规的网络安全渗透测试

目录&#xff1a; 前言 互联网突破 第一层内网 第二层内网 总结 前言 上个月根据领导安排&#xff0c;需要到本市一家电视台进行网络安全评估测试。通过对内外网进行渗透测试&#xff0c;网络和安全设备的使用和部署情况&#xff0c;以及网络安全规章流程出具安全评估报告。本…

el-table,新增、复制数据后,之前的勾选状态丢失

需要考虑是否为 更新数据的方式不对 如果新增数据的方式是直接替换原数据数组&#xff0c;而不是通过正确的响应式数据更新方式&#xff08;如使用 Vue 的 this.$set 等方法 &#xff09;&#xff0c;也可能导致勾选状态丢失。 因为 Vue 依赖数据的响应式变化来准确更新视图和…

第15届蓝桥杯java-c组省赛真题

目录 一.拼正方形 1.题目 2.思路 3.代码 二.劲舞团 1.题目 2.思路 3.代码 三.数组诗意 1.题目 2.思路 3.代码 四.封闭图形个数 1.题目 2.思路 3.代码 五.吊坠 1.题目 六.商品库存管理 1.题目 2.思路 3.代码 七.挖矿 1.题目 2.思路 3.代码 八.回文字…