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

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

相关文章:

HOW - Axios 拦截器特性

目录 Axios 介绍拦截器特性1. 统一添加 Token(请求拦截器)2. 处理 401 未授权(响应拦截器)3. 统一处理错误信息(响应拦截器)4. 请求 Loading 状态管理5. 自动重试请求(如 429 过载)6…...

自适应信号处理任务(过滤,预测,重建,分类)

自适应滤波 # signals creation: u, v, d N = 5000 n = 10 u = np.sin(np.arange(0, N/10., N/50000...

电子电气架构 --- 面向服务的体系架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁&am…...

TypeScript 装饰器类型详解

TypeScript 装饰器类型详解 一、类装饰器 // 参数:类的构造函数 function ClassDecorator(constructor: Function) {Object.defineProperty(constructor.prototype, timestamp, {value: Date.now()}); }ClassDecorator class DataService {// 装饰后自动添加times…...

Nyquist内置函数-杂项函数

1 Nyquist内置函数-杂项函数 1.1 杂项函数 这些函数对于日常使用来说都是安全且推荐的。 1.1.1 to-mono(sound) [SAL] (to-mono sound) [LISP] 如果 sound 是多声道声音,返回其所有声道的总和;如果 sound 本身就是单声道声音,则直接返回&…...

基姆拉尔森计算公式

基姆拉尔森计算公式(Zellers Congruence 的变体)是一种快速根据公历日期计算星期几的数学公式。其核心思想是通过对年月日的数值进行特定变换和取模运算,直接得到星期几的结果。 公式定义 对于日期 年-月-日,公式如下&#xff1a…...

5 分钟用满血 DeepSeek R1 搭建个人 AI 知识库(含本地部署)

最近很多朋友都在问:怎么本地部署 DeepSeek 搭建个人知识库。 老实说,如果你不是为了研究技术,或者确实需要保护涉密数据,我真不建议去折腾本地部署。 为什么呢? 目前 Ollama 从 1.5B 到 70B 都只是把 R1 的推理能力…...

Python数据可视化-第6章-坐标轴的定制

环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容,本章为第6章 坐标轴的定制 本章主要介绍了坐标轴的定制,包括向任意位置添加坐标轴、定制刻度、隐藏轴脊和移动轴脊。 参考 第…...

18认识Qt坐标系

平面直角坐标系(笛卡尔坐标系) 数学上的坐标系 右手坐标系 计算机中的坐标系 左手坐标系 坐标系的原点(0,0) 就是屏幕的左上角 /窗口的左上角 给 Qt 的某个控件,设置位置,就需要指定坐标.对于这个控件来说, 坐标系原点就是相对于父窗口/控件的. QPushButton 的父元素/父控件/父…...

动态循环表单+动态判断表单类型+动态判断表单是否必填方法

页面效果: 接口请求到的数据格式: list: [{demandType: "设备辅助功能要求",demandSettingList: [{id: "1907384788664963074",name: "测试表单",fieldType: 0,contentValue: "",vaildStatus: 0, // 0 非必填&a…...

keep-alive缓存

#keep-alive缓存动态路由的使用指南# 代码如下图 &#xff1a; <router-view v-slot"{ Component }"> <keep-alive :include"[Hot, Notifications, User, Setting, Test]"> <component :is"Component" …...

25.4.3学习总结【Java】

又是一道错题&#xff1a; 1. 班级活动https://www.lanqiao.cn/problems/17153/learning/?page1&first_category_id1&sortdifficulty&asc1&second_category_id3 问题描述 小明的老师准备组织一次班级活动。班上一共有 n 名 (n 为偶数) 同学&#xff0c;老师…...

Python入门(3):语句

目录 1 基本语句 1.1 表达式语句 1.2 赋值语句 2 控制流语句 2.1 条件语句 2.2 循环语句 while循环&#xff1a; for循环&#xff1a; 2.3 流程控制语句 1. break语句&#xff1a;退出整个循环体 2. continue语句&#xff1a;只跳过本次循环&#xff0c;还会进…...

运维之 Centos7 防火墙(CentOS 7 Firewall for Operations and Maintenance)

运维之 Centos7 防火墙 1.介绍 Linux CentOS 7 防火墙/端口设置&#xff1a; 基础概念&#xff1a; 防火墙是一种网络安全设备&#xff0c;用于监控和控制网络流量&#xff0c;以保护计算机系统免受未经授权的访问和恶意攻击。Linux CentOS 7操作系统自带了一个名为iptables的…...

开发一个小程序需要多久时间?小程序软件开发周期

开发一个小程序所需时间受多种因素影响&#xff0c;以下为你详细列举&#xff1a; 一、需求复杂度。若只是简单展示类小程序&#xff0c;如企业宣传、产品介绍&#xff0c;功能单一&#xff0c;大概 1 - 2 周可完成。若涉及复杂交互&#xff0c;像电商小程序&#xff0c;涵盖商…...

【数据结构篇】算法征途:穿越时间复杂度与空间复杂度的迷雾森林

文章目录 【数据结构篇】算法征途&#xff1a;穿越时间复杂度与空间复杂度的迷雾森林 一、 什么是算法1. 算法的定义1.1 算法的五个特征1.2 好算法的特质 2. 时间复杂度3. 空间复杂度 【数据结构篇】算法征途&#xff1a;穿越时间复杂度与空间复杂度的迷雾森林 &#x1f4ac;欢…...

新增帧能耗指标|UWA Gears V1.0.9

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台&#xff0c;提供了实时监测和截帧分析功能&#xff0c;帮助您精准定位性能热点&#xff0c;提升应用的整体表现。 本次版本更新主要新增帧能耗指标&#xff0c;帮助大家对每一帧的能耗进行精准监控&#xff0c;快速…...

蓝桥杯嵌入式16届———LCD模块

LCD有官方给我们提供的库&#xff0c;我们使用其非常简单&#xff0c;唯一要注意的就是LCD和LED的引脚冲突。 引脚状况 STM32CubeMX 端口配置 使能 比赛给的选手 资源数据包中有以下三个文件&#xff0c;&#xff08;除去led相关的&#xff09;&#xff0c;将他们复制到自己…...

Ubuntu服务器挂载之前的数据硬盘

这里假设在挂载硬盘之前&#xff0c;您的硬盘从之前的服务器上正确卸载下来。请注意&#xff0c;以下任何操作不当都有可能导致硬盘数据丢失或损坏&#xff0c;如果您的数据非常重要&#xff0c;请及时备份。 1. 确认硬盘分区信息 使用以下命令查看磁盘信息&#xff0c;找到要…...

CMake在Windows环境下Visual Studio Code的使用

1&#xff0c;安装下载 地址&#xff1a;Visual Studio Code - Code Editing. Redefined 双击安装 选择安装路径 可勾选微软的AI工具 2&#xff0c;环境介绍 2.1 &#xff0c;界面介绍 2.2中文包的安装 下载中文简体 汉化后的界面 2.3 配置C/C环境 VSCode安装好之后&#xf…...

注意力机制在大语言模型中的原理与实现总结

注意力机制在大语言模型中的原理与实现总结 1. 章节介绍 在大语言模型的学习中&#xff0c;理解注意力机制至关重要。本章节旨在深入剖析注意力机制的原理及其在大语言模型中的应用&#xff0c;为构建和优化大语言模型提供理论与实践基础。通过回顾神经网络基础及传统架构的局…...

大学生机器人比赛实战(二)软件篇

大学生机器人比赛深度开发指南&#xff1a;核心技术详解与实战代码解析 作为参加过多次机器人竞赛的选手&#xff0c;我将详细剖析比赛中的核心技术实现&#xff0c;包括软件架构设计、实时系统应用、各大赛事代码特点以及性能优化技巧。本指南将帮助你从代码层面深入理解如何…...

AI大模型从0到1记录学习 day13

第 13 章 Python高级语法 13.1 浅拷贝与深拷贝  直接赋值&#xff1a;对象的引用&#xff08;别名&#xff09;&#xff0c;不产生拷贝。  浅拷贝&#xff1a;拷贝父对象&#xff0c;不会拷贝对象的内部的子对象。拷贝后只有第一层是独立的。  深拷贝&#xff1a;完全拷贝…...

大模型学习三:DeepSeek R1蒸馏模型组ollama调用流程

一、说明 目前DeepSeek R1及其蒸馏模型均支持使用ollama进行调用&#xff0c;可以在模型主页查看调用情况 deepseek-r1https://ollama.com/library/deepseek-r1 显存需求 &#xff0c;我们显存是16G&#xff0c;可以玩好几个 二、以14B模型演示 1、安装ollama curl -fsSL htt…...

RAGFlow部署与使用介绍-深度文档理解和检索增强生成

ragflow部署与使用教程-智能文档处理与知识管理的创新引擎 1. ragflow简介 ​ RAGFlow作为新一代智能文档处理平台&#xff0c;深度融合检索增强生成&#xff08;RAG&#xff09;技术与自动化工作流引擎&#xff0c;为企业级知识管理提供全栈解决方案。通过结合多模态解析、语…...

一文读懂 UML:基础概念与体系框架

UML 图是一种标准化的建模语言&#xff0c;在软件开发和系统设计等领域有着广泛的应用。以下是对 UML 图各类图的详细介绍&#xff1a; 1.用例图 定义&#xff1a;用例图是从用户角度描述系统功能的模型图&#xff0c;展现了系统的参与者与用例之间的关系。作用&#xff1a;帮…...

【AI赋能:58招聘数据的深度剖析之旅】

影刀出鞘&#xff0c;抓取数据 在当今数字化时代&#xff0c;数据分析已成为企业决策和发展的关键驱动力。而获取高质量的数据则是数据分析的首要任务。在这个信息爆炸的时代&#xff0c;网络上蕴含着海量的数据&#xff0c;其中招聘网站的数据对于人力资源分析、市场趋势研究…...

几何法证明卡特兰数_栈混洗

模型&#xff1a; 考虑从坐标原点 (0, 0) 到点 (n, n) 的路径&#xff0c;要求路径只能向右&#xff08;x 方向&#xff09;或向上&#xff08;y 方向&#xff09;移动&#xff0c;并且路径不能越过直线 y x&#xff08;即始终满足 y< x &#xff09;。这样的路径数量就是…...

Kafka的安装与使用(windows下python使用等)

一、下载 可以去官网下载&#xff1a;https://kafka.apache.org/downloads 版本可选择&#xff0c;建议下载比较新的&#xff0c;新版本里面自带zookeeper 二、安装 创建一个目录&#xff0c;此处是D:\kafka&#xff0c;将文件放进去解压 如果文件后缀是gz&#xff0c;解压…...

DataPermissionInterceptor源码解读

原文首发在我的博客&#xff1a;https://blog.liuzijian.com/post/mybatis-plus-source-data-permission-interceptor.html 目录 一、概述二、源码解读2.1 beforeQuery2.2 beforePrepare2.3 processSelect2.4 setWhere2.5 processUpdate2.6 processDelete2.7 getUpdateOrDelete…...