axios介绍以及配置

news2025/4/5 13:34:14

Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js 环境中进行 HTTP 请求。

一、特点与基本用法

1.特点
  • 浏览器兼容性好:能在多种现代浏览器中使用,包括 Chrome、Firefox、Safari 等。
  • 支持 Promise API:基于 Promise 实现,使得异步操作更易于处理和管理,可方便地进行链式调用和错误处理。
  • 拦截请求和响应:可以在请求发送前和响应接收后进行拦截,对请求和响应进行处理,如添加请求头、验证响应数据等。
  • 取消请求:提供了取消请求的功能,可在特定情况下取消未完成的请求,节省资源。
  • 自动转换 JSON 数据:能自动将响应数据转换为 JSON 格式,方便处理和使用。
特性说明
Promise 支持基于 Promise 的异步请求,支持 async/await,链式调用更直观。
拦截器机制全局/实例级请求和响应拦截器,可统一添加 Token、处理错误日志等。
自动 JSON 转换自动将请求体序列化为 JSON,响应体反序列化为 JSON(可配置 transformRequest/Response)。
取消请求基于 CancelToken(旧版)或 AbortController(新版)取消请求。
并发请求通过 axios.all 和 axios.spread 处理多个并发请求。
浏览器与 Node.js支持浏览器(XHR)和 Node.js(HTTP 模块)环境,通用性强。
2.基本用法

在浏览器环境中,首先要引入 Axios 库,然后就可以使用它来发送各种 HTTP 请求。例如,发送一个 GET 请求获取数据:

axios.get('https://example.com/api/data')
  .then(response => console.log(response.data))
  .catch(error => console.error(error));

发送一个 POST 请求来提交数据:

axios.post('https://example.com/api/create', { name: 'John', age: 30 })
  .then(response => console.log(response.data))
  .catch(error => console.error(error));

还可以通过配置选项来定制请求,如设置请求头、超时时间等:

axios({
  method: 'get',
  url: 'https://example.com/api/data',
  headers: { 'Authorization': 'Bearer token' },
  timeout: 5000
})
.then(response => console.log(response.data))
.catch(error => console.error(error));

二、配置

1.全局配置

可以使用axios.defaults来设置全局默认配置。例如:

axios.defaults.baseURL = 'https://example.com/api';
axios.defaults.headers.common['Authorization'] = 'Bearer token';
axios.defaults.timeout = 5000;

上述代码设置了全局的基础 URL、请求头中的授权信息以及超时时间。

2.实例配置

创建一个 Axios 实例并进行配置:

const instance = axios.create({
  baseURL: 'https://another-example.com/api',
  headers: {
    'Content - Type': 'application/json'
  },
  timeout: 3000
});

这样就创建了一个具有特定配置的 Axios 实例,后续使用该实例发送请求时会应用这些配置。

3.请求配置

在发送请求时也可以直接传入配置参数:

axios.get('https://example.com/api/data', {
  headers: { 'Custom - Header': 'Value' },
  params: { id: 123 }
})
.then(response => console.log(response.data))
.catch(error => console.error(error));

这里为单个 GET 请求设置了自定义请求头和查询参数。

4.拦截器配置

可以使用拦截器在请求发送前或响应接收后进行一些处理:

// 请求拦截器
axios.interceptors.request.use(config => {
  // 在发送请求前做些什么,如添加时间戳
  config.params = { ...config.params, timestamp: Date.now() };
  return config;
}, error => {
  return Promise.reject(error);
});

// 响应拦截器
axios.interceptors.response.use(response => {
  // 对响应数据做些处理,如统一格式化
  response.data = formatResponseData(response.data);
  return response;
}, error => {
  return Promise.reject(error);
});

请求拦截器可以修改请求配置,响应拦截器可以处理响应数据。

三、进阶用法示例

(1)自定义实例与配置
// 创建独立实例(如不同后端服务)
const apiClient = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 10000,
  headers: { 'X-Custom-Header': 'value' }
});

// 修改实例默认配置
apiClient.defaults.headers.common['Authorization'] = 'Bearer token';
(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}%`);
  }
});
(3)错误统一处理
// 响应拦截器统一处理错误
apiClient.interceptors.response.use(
  (response) => response,
  (error) => {
    if (error.response) {
      // 服务端返回 4xx/5xx 错误
      console.error(`请求失败:${error.response.status}`, error.response.data);
    } else if (error.request) {
      // 请求已发送但无响应(如超时)
      console.error('请求未收到响应', error.request);
    } else {
      // 请求配置错误
      console.error('请求配置错误', error.message);
    }
    return Promise.reject(error);
  }
);

四、Axios 与其他 HTTP 客户端的对比

1. Axios vs Fetch API
特性AxiosFetch API
语法简洁性链式调用,配置简洁。需手动处理响应和错误(.then().catch())。
JSON 处理自动序列化请求体和反序列化响应体。需手动调用 response.json()
拦截器支持全局和实例级拦截器。需自行封装或使用第三方库。
取消请求支持 CancelToken 或 AbortController。需使用 AbortController。
浏览器兼容性兼容 IE11+(需 polyfill)。兼容现代浏览器,IE 需 polyfill。
请求超时原生支持 timeout 配置。需通过 AbortController + setTimeout 实现。
2. Axios vs jQuery.ajax
特性AxiosjQuery.ajax
依赖项轻量级(无 jQuery 依赖)。依赖 jQuery 库。
Promise 支持原生 Promise。基于 Deferred 对象(需适配 Promise)。
现代特性支持拦截器、取消请求等。功能较基础,扩展性有限。
TypeScript 支持官方提供类型定义。需社区维护的类型定义。
3. Axios vs 其他库(如 ky、SuperAgent)
特性Axiosky(现代轻量库)SuperAgent(老牌库)
体积约 13KB(压缩后)。约 5KB(压缩后)。约 20KB(压缩后)。
Node.js 支持支持。仅浏览器环境(需 ky-universal)。支持。
链式调用支持。支持(如 ky.get().json())。支持(.then() 风格)。
社区活跃度高(GitHub 50k+ Stars)。中等(GitHub 8k+ Stars)。下降趋势(维护较少)。

五、Axios 实践 

1. 统一请求管理

封装请求工具类

class HttpClient {
  constructor(baseURL) {
    this.client = axios.create({ baseURL });
    this._setupInterceptors();
  }

  _setupInterceptors() {
    this.client.interceptors.request.use(this._handleRequest);
    this.client.interceptors.response.use(this._handleResponse, this._handleError);
  }

  _handleRequest(config) {
    config.headers['X-Request-Id'] = uuidv4(); // 添加唯一请求 ID
    return config;
  }

  _handleResponse(response) {
    return response.data; // 直接返回数据,省略响应结构
  }

  _handleError(error) {
    // 统一错误处理逻辑
    throw error;
  }

  get(url, config) { return this.client.get(url, config); }
  post(url, data, config) { return this.client.post(url, data, config); }
  // 其他方法...
}
2. 结合 TypeScript 使用
interface ApiResponse<T> {
  code: number;
  data: T;
  message: string;
}

const fetchUser = async (userId: string): Promise<ApiResponse<User>> => {
  const response = await axios.get<ApiResponse<User>>(`/users/${userId}`);
  return response.data;
};
3. 性能优化
  • 请求缓存
const cache = new Map();

const fetchWithCache = async (url) => {
  if (cache.has(url)) return cache.get(url);
  const response = await axios.get(url);
  cache.set(url, response.data);
  return response.data;
};
  • 并发请求优化
// 使用 Promise.all 并行请求
const [user, posts] = await Promise.all([
  axios.get('/user/1'),
  axios.get('/posts?userId=1')
]);

六、适用场景与总结

1. 推荐使用 Axios 的场景
  • 需要拦截器统一处理日志、鉴权等逻辑。
  • 项目需兼容浏览器和 Node.js 环境。
  • 期望简化 JSON 数据处理和错误处理。
  • 需要取消请求或上传进度监控功能。
2. 不推荐使用 Axios 的场景
  • 极简项目(可直接使用 Fetch API)。
  • 对包体积敏感且无需高级功能(可考虑 ky)。
3.总结

Axios 凭借其丰富的功能、良好的兼容性和强大的社区支持,成为前端开发中最受欢迎的 HTTP 客户端之一。结合 TypeScript 和合理封装,可显著提升代码可维护性和开发效率。对于现代项目,若无需复杂功能,也可考虑轻量替代品(如 ky),但 Axios 仍是大多数场景下的首选。

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

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

相关文章

深入解析:HarmonyOS Design设计语言的核心理念

深入解析&#xff1a;HarmonyOS Design设计语言的核心理念 在当今数字化迅速发展的时代&#xff0c;用户对操作系统的体验要求越来越高。华为的HarmonyOS&#xff08;鸿蒙操作系统&#xff09;应运而生&#xff0c;旨在为用户提供全场景、全设备的智慧体验。其背后的设计语言—…

dfs记忆化搜索刷题 + 总结

文章目录 记忆化搜索 vs 动态规划斐波那契数题解代码 不同路径题解代码 最长递增子序列题解代码 猜数字大小II题解代码 矩阵中的最长递增路径题解代码 总结 记忆化搜索 vs 动态规划 1. 记忆化搜索&#xff1a;有完全相同的问题/数据保存起来&#xff0c;带有备忘录的递归 2.记忆…

【Linux】进程的详讲(中上)

目录 &#x1f4d6;1.什么是进程? &#x1f4d6;2.自己写一个进程 &#x1f4d6;3.操作系统与内存的关系 &#x1f4d6;4.PCB(操作系统对进程的管理) &#x1f4d6;5.真正进程的组成 &#x1f4d6;6.形成进程的过程 &#x1f4d6;7、Linux环境下的进程知识 7.1 task_s…

优选算法的巧思之径:模拟专题

专栏&#xff1a;算法的魔法世界 个人主页&#xff1a;手握风云 目录 一、模拟 二、例题讲解 2.1. 替换所有的问号 2.2. 提莫攻击 2.3. Z字形变换 2.4. 外观数列 2.5. 数青蛙 一、模拟 模拟算法说简单点就是照葫芦画瓢&#xff0c;现在草稿纸上模拟一遍算法过程&#xf…

【云服务器】在Linux CentOS 7上快速搭建我的世界 Minecraft 服务器搭建,并实现远程联机,详细教程

【云服务器】在Linux CentOS 7上快速搭建我的世界 Minecraft 服务器搭建&#xff0c;详细详细教程 一、 服务器介绍二、下载 Minecraft 服务端三、安装 JDK 21四、搭建服务器五、本地测试连接六、添加服务&#xff0c;并设置开机自启动 前言&#xff1a; 推荐使用云服务器部署&…

文本分析(非结构化数据挖掘)——特征词选择(基于TF-IDF权值)

TF-IDF是一种用于信息检索和文本挖掘的常用加权算法&#xff0c;用于评估一个词在文档或语料库中的重要程度。它结合了词频&#xff08;TF&#xff09;和逆文档频率&#xff08;IDF&#xff09;两个指标&#xff0c;能够有效过滤掉常见词&#xff08;如“的”、“是”等&#x…

【JavaSE】小练习 —— 图书管理系统

【JavaSE】JavaSE小练习 —— 图书管理系统 一、系统功能二、涉及的知识点三、业务逻辑四、代码实现4.1 book 包4.2 user 包4.3 Main 类4.4 完善管理员菜单和普通用户菜单4.5 接着4.4的管理员菜单和普通用户菜单&#xff0c;进行操作选择&#xff08;1查找图书、2借阅图书.....…

多线程(多线程案例)(续~)

目录 一、单例模式 1. 饿汉模式 2. 懒汉模式 二、阻塞队列 1. 阻塞队列是什么 2. 生产者消费者模型 3. 标准库中的阻塞队列 4. 自实现阻塞队列 三、定时器 1. 定时器是什么 2. 标准库中的定时器 欢迎观看我滴上一篇关于 多线程的博客呀&#xff0c;直达地址&#xf…

一个判断A股交易状态的python脚本

最近在做股票数据相关的项目&#xff0c;需要用到判断某一天某个时刻A股的状态&#xff0c;比如休市&#xff0c;收盘&#xff0c;交易中等&#xff0c;发动脑筋想了一下&#xff0c;这个其实还是比较简单的&#xff0c;这里我把实现方法分享给大家。 思路 当天是否休市 对于某…

闪记(FlashNote):让灵感快速成文的轻量级笔记工具

闪记&#xff08;FlashNote&#xff09;&#xff1a;让灵感快速成文的轻量级笔记工具 你是否经常遇到这样的情况&#xff1a;桌面上放了一大堆的新建123.txt&#xff0c;想记录一个想法&#xff0c;应该是一键开个一个快捷键然后瞬间记录就自动保存了&#xff0c;现在的很多笔记…

《大模型部署》——ollama下载及大模型本地部署(详细快速部署)

ollama Ollama 是一款开源跨平台的大语言模型&#xff08;LLM&#xff09;运行工具&#xff0c;旨在简化本地部署和管理 AI 模型的流程。 下载ollama 进入官网下载https://ollama.com/ 选择需要的系统下载 下载完成后直接进行安装 下载大模型 选择想要部署的模型&#…

Geotools结合SLD实现矢量中文标注下的乱码和可用字体解析

目录 前言 一、需求溯源 1、原始的SLD渲染 2、最初的效果 二、问题修复 1、还是字符编码 2、如何选择可用的字体 3、如何查看支持的字体库 三、总结 前言 随着地理信息系统&#xff08;GIS&#xff09;技术的不断发展&#xff0c;矢量数据的可视化和标注成为了地理信息展…

基于Python与CATIA V5的斐波那契螺旋线自动化建模技术解析

引言 斐波那契螺旋线&#xff08;Fibonacci Spiral&#xff09;作为自然界广泛存在的黄金比例曲线&#xff0c;在工业设计、产品造型、机械工程等领域具有重要应用价值。本文将以Python控制CATIA V5进行参数化建模为例&#xff0c;深入解析三维CAD环境中复杂数学曲线的自动化生…

动态规划(11.按摩师)

题目链接&#xff1a;面试题 17.16. 按摩师 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 状态表示&#xff1a; 对于简单的线性 dp &#xff0c;我们可以⽤「经验 题⽬要求」来定义状态表⽰&#xff1a; 以某个位置为结尾&#xff0c;巴拉巴拉&#xff1b;…

CentOS下安装Docker,Docker下安装JDK\MYSQL\REDIS\NGINX

先用VM安装好Centos8.5&#xff0c;可以选择安装迷你版&#xff0c;我安装的是UI版。 然后用MobaXterm_Portable_v23.0_cn连上去&#xff0c;互访成功就可以往下操作。 1. 修改文件&#xff1a;就是要把之前的mirror替换成现在的vault cd /etc/yum.repos.d/sed -i s/mirrorl…

demo.launch(inbrowser=True, share=True)无法生成共享网址

Gradio 的共享功能无法正常工作&#xff0c;原因是缺少一个名为 frpc_windows_amd64_v0.3 用到代码 app.demo.launch(show_errorTrue, inbrowserTrue, shareTrue) show_errorTrue&#xff1a;这个参数的作用是当应用在启动过程中出现错误时&#xff0c;会显示错误信息。这对于调…

翻译: 人工智能如何让世界变得更美好二

Basic assumptions and framework 基本假设和框架 To make this whole essay more precise and grounded, it’s helpful to specify clearly what we mean by powerful AI (i.e. the threshold at which the 5-10 year clock starts counting), as well as laying out a fram…

【vue】editor富文本输入全英文,谷歌浏览器:元素不会自动换行bug

【vue】editor富文本输入全英文&#xff0c;谷歌浏览器&#xff1a;元素不会自动换行bug 解决方案&#xff1a;给元素一个宽度 100% .editor {width: 100%; }

# OpenCV实现人脸与微笑检测:从图像到视频的实战应用

OpenCV实现人脸与微笑检测&#xff1a;从图像到视频的实战应用 在计算机视觉领域&#xff0c;人脸检测和微笑检测是两个非常有趣且实用的任务。它们广泛应用于智能监控、社交媒体分析、人机交互等多个场景。本文将通过两个代码示例&#xff0c;详细介绍如何使用OpenCV实现人脸…

Kubernetes可视化面板——KubePi(Kubernetes Visualization Panel - kubepi)

Kubernetes可视化管理面板——KubePi 在云计算和容器化的大潮下&#xff0c;Kubernetes 已成为管理容器集群的事实标准。然而&#xff0c;面对复杂的集群管理和运维工作&#xff0c;一个直观、易用的可视化工具显得至关重要。KubePi 正是为此而生——一款专为简化 Kubernetes …