Axios全解析:从基础到高级实战技巧

news2025/5/18 16:57:03

目录

  1. 核心特性

  2. 安装配置

  3. 基础使用

  4. 高级功能

  5. 错误处理

  6. 拦截器机制

  7. 请求取消

  8. TypeScript支持

  9. 最佳实践

  10. 常见问题


1. 核心特性

1.1 核心优势
  • 全平台支持:浏览器 & Node.js 双环境

  • 自动转换:JSON数据自动序列化

  • 拦截器系统:请求/响应全链路控制

  • 取消令牌:精准控制请求生命周期

  • 防御性设计:XSRF 跨站攻击防护

  • 进度跟踪:文件上传下载进度监控

1.2 性能对比
特性AxiosFetch 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; // 5MB
  const 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源码解析

  • 企业级封装示例

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

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

相关文章

uniapp|实现获取手机摄像头权限,调用相机拍照实现人脸识别相似度对比,拍照保存至相册,多端兼容(APP/微信小程序)

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

JavaScript【7】BOM模型

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

[强化学习的数学原理—赵世钰老师]学习笔记02-贝尔曼方程

本人为强化学习小白&#xff0c;为了在后续科研的过程中能够较好的结合强化学习来做相关研究&#xff0c;特意买了西湖大学赵世钰老师撰写的《强化学习数学原理》中文版这本书&#xff0c;并结合赵老师的讲解视频来学习和更深刻的理解强化学习相关概念&#xff0c;知识和算法技…

深入理解构造函数,析构函数

目录 1.引言 2.构造函数 1.概念 2.特性 3.析构函数 1.概念 2.特性 1.引言 如果一个类中什么都没有&#xff0c;叫作空类. 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、三分构图法 三分构图法即将画面横竖各分为三份&#xff0c;即九宫格形式。 将画面用两条竖线和两条横线分割&#xff0c;就如同是书写中文的【井】字。这样就可以得到4个交叉点&#xff0c;然后再将需要表现的重点放置在4个交叉点中的一个附近即可。 拍摄自然风光时&#xf…

DAY 28 类的定义和方法

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

RAG数据处理:PDF/HTML

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

机器学习 day04

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

蓝牙耳机什么牌子好?倍思值得冲不?

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

机器学习-人与机器生数据的区分模型测试-数据处理 - 续

这里继续 机器学习-人与机器生数据的区分模型测试-数据处理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)快速发展的今天&#xff0c;ESP系列单片机凭借其优异的无线连接能力和丰富的功能特性&#xff0c;已成为智能家居、智慧农业、工业自动化等领域的首选方案。本文将深入分析各款ESP芯片的特点&#xff0c;结合典型应用场景&#xff0c;帮助开发者做出最优选择…

特斯拉虚拟电厂:能源互联网时代的分布式革命

在双碳目标与能源转型的双重驱动下&#xff0c;特斯拉虚拟电厂&#xff08;Virtual Power Plant, VPP&#xff09;通过数字孪生技术与能源系统的深度融合&#xff0c;重构了传统电力系统的运行范式。本文从系统架构、工程实践、技术挑战三个维度&#xff0c;深度解析这一颠覆性…

【Linux笔记】nfs网络文件系统与autofs(nfsdata、autofs、autofs.conf、auto.master)

一、nfs概念 NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09; 是一种由 Sun Microsystems 于1984年开发的分布式文件系统协议&#xff0c;允许用户通过网络访问远程计算机上的文件&#xff0c;就像访问本地文件一样。它广泛应用于 Unix/Linux 系统&a…

博客打卡-求解流水线调度

题目如下&#xff1a; 有n个作业&#xff08;编号为1&#xff5e;n&#xff09;要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工&#xff0c;然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi&#xff08;1≤i≤n&#xff09;。 流水…

数据库blog1_信息(数据)的处理与效率提升

&#x1f33f;信息的处理 &#x1f342;实际中离不开信息处理 ● 解决问题的建模 任何对问题的处理都可以看作数据的输入、处理、输出。 eg.一个项目中&#xff0c;用户点击信息由前端接收传递到后端处理后返回结果eg.面对一个问题&#xff0c;我们在搜集信息后做出处理与分析…

布隆过滤器介绍及其在大数据场景的应用

目录 布隆过滤器&#xff08;Bloom Filter&#xff09;介绍一、布隆过滤器的基本原理插入元素过程&#xff1a;查询元素过程&#xff1a; 二、布隆过滤器的特点三、误判率计算四、举例说明五、总结 Python版的简单布隆过滤器实现示例一、简单布隆过滤器Python示例二、布隆过滤器…

Fidder基本操作

1.抓取https请求 Fidder默认不能抓取https请求&#xff0c;我们必须通过相应的设置才能抓取https请求 1.选择tools下的option 2.选择https选项&#xff0c;并且勾选下面的选项 3.点击Actions导出信任证书到桌面(expert root certificate to desktop) 4.在浏览器中添加对应的证…

项目管理进阶:精读 78页华为项目管理高级培训教材【附全文阅读】

本文概述了华为项目管理&#xff08;高级&#xff09;课程的学习目标及学习方法。学习该课程后&#xff0c;学员应能&#xff1a; 1. **深刻理解项目管理**&#xff1a;掌握项目管理的基本概念与方法&#xff0c;构建项目管理思维框架。 2. **应用IBEST理念**&#xff1a;结合I…

[Java] 方法和数组

目录 1. 方法 1.2 什么是方法 1.2 方法的定义 1.3 方法的调用 1.4 方法的重载 1.5 递归 2. 一维数组 2.1 什么是数组 2.2 数组的创建 2.3 数组的初始化 2.4 遍历数组 2.5 引用数据类型 2.6 关于null 2.7 数组转字符串 2.8 数组元素的查找 2.9 数组的排序 2.10…