Axios全解析:从基础到高级实战技巧
目录
-
核心特性
-
安装配置
-
基础使用
-
高级功能
-
错误处理
-
拦截器机制
-
请求取消
-
TypeScript支持
-
最佳实践
-
常见问题
1. 核心特性
1.1 核心优势
-
全平台支持:浏览器 & Node.js 双环境
-
自动转换:JSON数据自动序列化
-
拦截器系统:请求/响应全链路控制
-
取消令牌:精准控制请求生命周期
-
防御性设计:XSRF 跨站攻击防护
-
进度跟踪:文件上传下载进度监控
1.2 性能对比
特性 | Axios | Fetch API |
---|---|---|
浏览器兼容性 | IE11+ | Chrome 42+ |
请求取消 | ✅ | 需AbortController |
超时设置 | 原生支持 | 需手动封装 |
拦截器 | 内置系统 | 需自行实现 |
上传进度 | 事件监听 | 不可用 |
2. 安装配置
2.1 安装方式
# NPM
npm install axios# Yarn
yarn add axios# CDN (浏览器环境)
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
2.2 全局配置
// 设置基准路径
axios.defaults.baseURL = 'https://api.yourdomain.com/v2';// 配置超时时间(毫秒)
axios.defaults.timeout = 10000; // 设置公共头信息
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
3. 基础使用
3.1 发起请求
// GET请求(参数自动编码)
axios.get('/user', {params: {ID: 12345,role: 'admin'}
})// POST请求(自动序列化JSON)
axios.post('/user', {firstName: 'Fred',lastName: 'Flintstone'
})// 并发请求
const [userRes, orderRes] = await Promise.all([axios.get('/user/123'),axios.get('/orders?user=123')
]);
3.2 响应结构解析
{data: {}, // 响应主体status: 200, // HTTP状态码statusText: 'OK',headers: {}, // 响应头(自动格式化)config: {}, // 请求配置request: {} // 原始请求对象
}
4. 高级功能
4.1 创建实例
const apiClient = axios.create({baseURL: 'https://api.example.com',timeout: 5000,headers: {'X-Custom-Header': 'foobar'}
});// 使用实例
apiClient.get('/products');
4.2 文件上传(含进度)
const formData = new FormData();
formData.append('file', fileInput.files[0]);axios.post('/upload', formData, {headers: {'Content-Type': 'multipart/form-data'},onUploadProgress: progressEvent => {const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total);console.log(`上传进度:${percent}%`);}
});
5. 错误处理
5.1 错误类型识别
axios.get('/user/123').catch(error => {if (error.response) {// 服务端响应异常(2xx外的状态码)console.log('服务器错误:', error.response.status);} else if (error.request) {// 请求已发送但无响应console.log('网络错误:', error.message);} else {// 配置错误console.log('配置错误:', error.message);}});
5.2 全局错误处理
// 响应拦截器统一处理
axios.interceptors.response.use(response => response,error => {const status = error.response?.status;if (status === 401) {window.location.href = '/login';} else if (status >= 500) {alert('服务器异常,请稍后重试');}return Promise.reject(error);}
);
6. 拦截器机制
6.1 请求拦截器
axios.interceptors.request.use(config => {// 添加认证令牌const token = localStorage.getItem('authToken');if (token) {config.headers.Authorization = `Bearer ${token}`;}// 添加时间戳防止缓存config.params = {...config.params,_t: Date.now()};return config;
});
6.2 响应拦截器
axios.interceptors.response.use(response => {// 统一处理业务状态码if (response.data.code !== 200) {return Promise.reject(response.data.msg);}return response.data;},error => {// 统一错误格式return Promise.reject({code: error.response?.status || 0,message: error.message});}
);
7. 请求取消
7.1 CancelToken方案(旧版)
const source = axios.CancelToken.source();axios.get('/user', {cancelToken: source.token
});// 取消请求
source.cancel('用户主动取消操作');
7.2 Fetch AbortController(推荐)
const controller = new AbortController();axios.get('/user', {signal: controller.signal
}).catch(err => {if (axios.isCancel(err)) {console.log('请求取消:', err.message);}
});// 取消请求
controller.abort('页面跳转取消');
8. TypeScript支持
8.1 响应类型定义
interface UserProfile {id: number;name: string;email: string;
}axios.get<UserProfile>('/user/123').then(response => {console.log(response.data.name); // 自动类型推断});
8.2 扩展默认配置
declare module 'axios' {interface AxiosRequestConfig {retry?: number; // 自定义重试配置showLoading?: boolean;}
}// 使用自定义配置
axios.get('/data', { retry: 3,showLoading: true
});
9. 最佳实践
9.1 分层架构
src/
├─ api/
│ ├─ auth.ts // 认证相关接口
│ ├─ product.ts // 商品模块接口
│ └─ index.ts // 统一导出
├─ utils/
│ └─ request.ts // Axios实例封装
9.2 安全实践
// CSRF防御
axios.defaults.xsrfCookieName = 'csrftoken';
axios.defaults.xsrfHeaderName = 'X-CSRFToken';// 速率限制
const rateLimitedAxios = axios.create();
let lastRequestTime = 0;rateLimitedAxios.interceptors.request.use(config => {const now = Date.now();if (now - lastRequestTime < 1000) {return Promise.reject(new Error('请求过于频繁'));}lastRequestTime = now;return config;
});
10. 常见问题
Q1: 如何防止重复提交?
const pendingRequests = new Map();axios.interceptors.request.use(config => {const requestKey = `${config.method}-${config.url}`;if (pendingRequests.has(requestKey)) {return Promise.reject(new Error('重复请求已阻止'));}pendingRequests.set(requestKey, true);config.complete = () => {pendingRequests.delete(requestKey);};return config;
});
Q2: 大文件分片上传?
async function uploadLargeFile(file) {const CHUNK_SIZE = 5 * 1024 * 1024; // 5MBconst totalChunks = Math.ceil(file.size / CHUNK_SIZE);for (let i = 0; i < totalChunks; i++) {const chunk = file.slice(i * CHUNK_SIZE, (i+1) * CHUNK_SIZE);await axios.post('/upload-chunk', {chunk,index: i,total: totalChunks,fileHash: file.hash});}
}
进阶资源
-
Axios官方文档
-
Axios源码解析
-
企业级封装示例
相关文章:
Axios全解析:从基础到高级实战技巧
目录 核心特性 安装配置 基础使用 高级功能 错误处理 拦截器机制 请求取消 TypeScript支持 最佳实践 常见问题 1. 核心特性 1.1 核心优势 全平台支持:浏览器 & Node.js 双环境 自动转换:JSON数据自动序列化 拦截器系统:请求…...
EXO 可以将 Mac M4 和 Mac Air 连接起来,并通过 Ollama 运行 DeepSeek 模型
EXO 可以将 Mac M4 和 Mac Air 连接起来,并通过 Ollama 运行 DeepSeek 模型。以下是具体实现方法: 1. EXO 的分布式计算能力 EXO 是一个支持 分布式 AI 计算 的开源框架,能够将多台 Mac 设备(如 M4 和 Mac Air)组合成…...
数据库故障排查指南
数据库连接问题 检查数据库服务是否正常运行,确认网络连接是否畅通,验证数据库配置文件的正确性,确保用户名和密码无误。 性能问题 分析慢查询日志,优化SQL语句,检查索引使用情况,调整数据库参数配置&am…...
RBTree的模拟实现
1:红黑树的概念 红⿊树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍,因…...
docker-compose——安装mongo
编写docker-compose.yml version : 3.8services:zaomeng-mongodb:container_name: zaomeng-mongodbimage: mongo:latestrestart: alwaysports:- 27017:27017environment:- MONGO_INITDB_ROOT_USERNAMEroot- MONGO_INITDB_ROOT_PASSWORDpssw0rdvolumes:- ./mongodb/data:/data/…...
Vue 3.0中响应式依赖和更新
响应式依赖和更新是Vue 3.0中最重要的机制,其核心代码如下,本文将结合代码对这个设计机制作出一些解释。 // 全局依赖存储:WeakMap<target, Map<key, Set<effect>>> const targetMap new WeakMap();// 当前活动的副作用函…...

uniapp|实现获取手机摄像头权限,调用相机拍照实现人脸识别相似度对比,拍照保存至相册,多端兼容(APP/微信小程序)
基于uniapp以及微信小程序实现移动端人脸识别相似度对比,实现摄像头、相册权限获取、相机模块交互、第三方识别集成等功能,附完整代码。 目录 核心功能实现流程摄像头与相册权限申请权限拒绝后的引导策略摄像头调用拍照事件处理人脸识别集成图片预处理(Base64编码/压缩)调用…...

JavaScript【7】BOM模型
1.概述: BOM(Browser Object Model,浏览器对象模型)是 JavaScript 中的一个重要概念,它提供了一系列对象来访问和操作浏览器的功能和信息。与 DOM(Document Object Model)主要关注文档结构不同&…...

[强化学习的数学原理—赵世钰老师]学习笔记02-贝尔曼方程
本人为强化学习小白,为了在后续科研的过程中能够较好的结合强化学习来做相关研究,特意买了西湖大学赵世钰老师撰写的《强化学习数学原理》中文版这本书,并结合赵老师的讲解视频来学习和更深刻的理解强化学习相关概念,知识和算法技…...
使用Spring Boot与Spring Security构建安全的RESTful API
使用Spring Boot与Spring Security构建安全的RESTful API 引言 在现代Web应用开发中,安全性是不可忽视的重要环节。Spring Boot和Spring Security作为Java生态中的主流框架,为开发者提供了强大的工具来构建安全的RESTful API。本文将详细介绍如何结合S…...

深入理解构造函数,析构函数
目录 1.引言 2.构造函数 1.概念 2.特性 3.析构函数 1.概念 2.特性 1.引言 如果一个类中什么都没有,叫作空类. class A {}; 那么我们这个类中真的是什么都没有吗?其实不是,如果我们类当中上面都不写.编译器会生成6个默认的成员函数。 默认成员函数:用户没有显…...

Day 16
目录 1.JZ79 判断是不是平衡二叉树1.1 解析1.2 代码 2.DP10 最大子矩阵2.1 解析2.2 代码 1.JZ79 判断是不是平衡二叉树 JZ79 判断是不是平衡二叉树 dfs 1.1 解析 1.2 代码 /*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(in…...

摄影构图小节
1、三分构图法 三分构图法即将画面横竖各分为三份,即九宫格形式。 将画面用两条竖线和两条横线分割,就如同是书写中文的【井】字。这样就可以得到4个交叉点,然后再将需要表现的重点放置在4个交叉点中的一个附近即可。 拍摄自然风光时…...

DAY 28 类的定义和方法
知识点回顾: 类的定义pass占位语句类的初始化方法类的普通方法类的继承:属性的继承、方法的继承 比如def、class这些定义的关键词后,必须有一个有占据缩进位置的代码块。 还有下面这些依赖缩进的语句,都可以用pass语句来占位 x 1…...

RAG数据处理:PDF/HTML
RAG而言用户输入的数据通常是各种各样文档,本文主要采用langchain实现PDF/HTML文档的处理方法 PDF文档解析 PDF文档很常见格式,但内部结构常常较复杂: 复杂的版式布局多样的元素(段落、表格、公式、图片等)文本流无…...

机器学习 day04
文章目录 前言一、线性回归的基本概念二、损失函数三、最小二乘法 前言 通过今天的学习,我掌握了机器学习中的线性回归的相关基本概念,包括损失函数的概念,最小二乘法的理论与算法实现。 一、线性回归的基本概念 要理解什么是线性回归&…...

蓝牙耳机什么牌子好?倍思值得冲不?
最近总被问“蓝牙耳机什么牌子好”,作为踩过无数坑的资深耳机党,必须安利刚入手的倍思M2s Pro主动降噪蓝牙耳机!降噪、音质、颜值全都在线,性价比直接拉满。 -52dB降噪,通勤摸鱼神器 第一次开降噪就被惊到!…...

机器学习-人与机器生数据的区分模型测试-数据处理 - 续
这里继续 机器学习-人与机器生数据的区分模型测试-数据处理1的内容 查看数据 中1的情况 #查看数据1的分布情况 one_ratio_list [] for col in data.columns:if col city or col target or col city2: # 跳过第一列continueelse:one_ratio data[col].mean() # 计算1值占…...

ESP系列单片机选择指南:结合实际场景的最优选择方案
前言 在物联网(IoT)快速发展的今天,ESP系列单片机凭借其优异的无线连接能力和丰富的功能特性,已成为智能家居、智慧农业、工业自动化等领域的首选方案。本文将深入分析各款ESP芯片的特点,结合典型应用场景,帮助开发者做出最优选择…...

特斯拉虚拟电厂:能源互联网时代的分布式革命
在双碳目标与能源转型的双重驱动下,特斯拉虚拟电厂(Virtual Power Plant, VPP)通过数字孪生技术与能源系统的深度融合,重构了传统电力系统的运行范式。本文从系统架构、工程实践、技术挑战三个维度,深度解析这一颠覆性…...
jvm安全点(三)openjdk17 c++源码垃圾回收之安全点结束,唤醒线程
1. VMThread::inner_execute() - 触发安全点 cpp 复制 void VMThread::inner_execute(VM_Operation* op) { if (op->evaluate_at_safepoint()) { SafepointSynchronize::begin(); // 进入安全点,阻塞所有线程 // ...执行GC等操作... SafepointSynchronize::…...
Python OOP核心技巧:如何正确选择实例方法、类方法和静态方法
Python方法类型全解析:实例方法、类方法与静态方法的使用场景 一、三种方法的基本区别二、访问能力对比表三、何时使用实例方法使用实例方法的核心场景:具体应用场景:1. 操作实例属性2. 对象间交互3. 实现特定实例的行为 四、何时使用类方法使…...

【Linux笔记】nfs网络文件系统与autofs(nfsdata、autofs、autofs.conf、auto.master)
一、nfs概念 NFS(Network File System,网络文件系统) 是一种由 Sun Microsystems 于1984年开发的分布式文件系统协议,允许用户通过网络访问远程计算机上的文件,就像访问本地文件一样。它广泛应用于 Unix/Linux 系统&a…...

博客打卡-求解流水线调度
题目如下: 有n个作业(编号为1~n)要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi(1≤i≤n)。 流水…...
基于React的高德地图api教程006:两点之间距离测量
文章目录 6、距离测量6.1 两点之间距离测量6.1.1 两点距离测量按钮6.1.2 点击地图添加点6.1.3 测量两点之间距离并画线6.2 测量过程显示两点之间预览线6.3 绘制完毕6.4 显示清除按钮6.5 代码下载6.06、距离测量 6.1 两点之间距离测量 6.1.1 两点距离测量按钮 实现代码: re…...

数据库blog1_信息(数据)的处理与效率提升
🌿信息的处理 🍂实际中离不开信息处理 ● 解决问题的建模 任何对问题的处理都可以看作数据的输入、处理、输出。 eg.一个项目中,用户点击信息由前端接收传递到后端处理后返回结果eg.面对一个问题,我们在搜集信息后做出处理与分析…...

布隆过滤器介绍及其在大数据场景的应用
目录 布隆过滤器(Bloom Filter)介绍一、布隆过滤器的基本原理插入元素过程:查询元素过程: 二、布隆过滤器的特点三、误判率计算四、举例说明五、总结 Python版的简单布隆过滤器实现示例一、简单布隆过滤器Python示例二、布隆过滤器…...
Ansys 计算刚柔耦合矩阵系数
Ansys 计算刚柔耦合系数矩阵 文章目录 Ansys 计算刚柔耦合系数矩阵卫星的刚柔耦合动力学模型采用 ANSYS 的 APDL 语言的计算方法系统转动惯量的求解方法参考文献 卫星的刚柔耦合动力学模型 柔性航天器的刚柔耦合动力学模型可以表示为 m v ˙ B t r a n η F J ω ˙ ω J…...
微服务八股(自用)
微服务 SpringCloud 注册中心:Eureka 负载均衡:Ribbon 远程调用:Feign 服务熔断:Hystrix 网关:Gateway/Zuul Alibaba 配置中心:Nacos 负载均衡:Ribbon 服务调用:Feign 服务…...
指定elf文件dwarf 版本以及查看dwarf版本号
背景: 在实际项目开发过程中,为了让低版本的CANape 工具识别elf 文件,需要在编译elf文件时,指定dwarf的版本。 使用方法: 需要再CMakeLists.txt中指定dwarf 版本 add_compile_options(-g -gdwarf-2) #-gdwarf-4 验…...