Axios核心原理

Axios 是一个基于 Promise 的 HTTP 客户端,它可以用于浏览器和 Node.js。其核心原理主要包括以下几个部分:

  1. 请求流程

Axios 的请求流程主要包括以下步骤:

创建实例:axios.create() 方法可以创建一个具有默认配置的 Axios 实例。

请求拦截器:在请求发送前,可以使用 axios.interceptors.request.use() 进行修改,如添加 token、修改 headers。

请求适配器:在浏览器环境中,Axios 通过 XMLHttpRequest(XHR) 发送请求,在 Node.js 环境中使用 http 模块。

响应拦截器:在请求返回后,axios.interceptors.response.use() 允许对响应数据进行处理,比如格式化数据或错误处理。


  1. 核心模块

Axios 主要由以下几个核心模块组成:

(1) Axios 类

Axios 是核心类,所有的请求都通过 Axios.prototype.request(config) 进行处理:

class Axios {
constructor(defaultConfig) {
this.defaults = defaultConfig;
this.interceptors = {
request: new InterceptorManager(),
response: new InterceptorManager(),
};
}

request(config) {
// 处理请求配置
config = mergeConfig(this.defaults, config);

// 构造拦截器链
let chain = [{ fulfilled: dispatchRequest, rejected: undefined }
];// 先添加请求拦截器
this.interceptors.request.forEach(interceptor => {chain.unshift(interceptor);
});// 再添加响应拦截器
this.interceptors.response.forEach(interceptor => {chain.push(interceptor);
});// 执行拦截器链
let promise = Promise.resolve(config);
while (chain.length) {const { fulfilled, rejected } = chain.shift();promise = promise.then(fulfilled, rejected);
}return promise;

}
}


(2) 拦截器 (InterceptorManager)

Axios 内部使用 InterceptorManager 管理拦截器,它的结构如下:

class InterceptorManager {
constructor() {
this.handlers = [];
}

use(fulfilled, rejected) {
this.handlers.push({ fulfilled, rejected });
}

forEach(fn) {
this.handlers.forEach(fn);
}
}

拦截器的执行顺序:

请求拦截器:先进后出(后添加的先执行)

响应拦截器:先进先出(先添加的先执行)


(3) 适配器 (adapters)

Axios 需要兼容不同的运行环境,因此通过适配器模式进行封装:

在 浏览器 环境下,使用 XMLHttpRequest 发送请求:

function xhrAdapter(config) {
return new Promise((resolve, reject) => {
const request = new XMLHttpRequest();
request.open(config.method.toUpperCase(), config.url, true);

request.onload = function () {resolve({data: request.responseText,status: request.status,headers: parseHeaders(request.getAllResponseHeaders()),config,});
};request.onerror = function () {reject(new Error("Network Error"));
};request.send(config.data);

});
}

在 Node.js 环境下,使用 http 模块:

function httpAdapter(config) {
return new Promise((resolve, reject) => {
const http = require(‘http’);
const req = http.request(config.url, (res) => {
let data = ‘’;
res.on(‘data’, chunk => data += chunk);
res.on(‘end’, () => resolve({ data, status: res.statusCode }));
});

req.on('error', reject);
req.write(config.data || '');
req.end();

});
}


(4) dispatchRequest 发送请求

dispatchRequest 负责选择适配器并发送请求:

function dispatchRequest(config) {
const adapter = config.adapter || (typeof XMLHttpRequest !== ‘undefined’ ? xhrAdapter : httpAdapter);
return adapter(config).then(response => {
return response;
});
}


  1. Axios 其他功能

(1) axios.create()

可以创建一个自定义实例,带有默认 config:

const instance = axios.create({
baseURL: ‘https://api.example.com’,
timeout: 1000,
});
instance.get(’/user’);

(2) 取消请求 (CancelToken)

Axios 允许取消请求,核心原理是 AbortController:

const controller = new AbortController();
axios.get(’/user’, { signal: controller.signal }).catch(err => console.log(err));

// 取消请求
controller.abort();

(3) 并发请求 (axios.all())

可以使用 Promise.all 进行并发请求:

axios.all([axios.get(’/user’), axios.get(’/posts’)])
.then(axios.spread((user, posts) => {
console.log(user.data, posts.data);
}));


  1. 总结

核心架构

  1. Axios 类:处理请求逻辑

  2. InterceptorManager:管理请求/响应拦截器

  3. dispatchRequest:调用适配器发送请求

  4. xhrAdapter & httpAdapter:兼容不同环境

拦截器机制

先进后出执行请求拦截器

先进先出执行响应拦截器

功能

axios.create():创建实例

axios.CancelToken:取消请求

axios.all():并发请求

这样,Axios 通过模块化设计,提供了一种可扩展、兼容性强的 HTTP 请求解决方案。


Axios 之所以被称为“基于 Promise 的 HTTP 客户端”,是因为它的内部实现依赖于 Promise 机制 来处理异步请求,并提供了链式调用的能力。


  1. 传统回调与 Promise 的区别

在使用 XMLHttpRequest 进行网络请求时,通常需要通过 回调函数 处理异步请求:

const xhr = new XMLHttpRequest();
xhr.open(‘GET’, ‘https://api.example.com/data’, true);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(JSON.parse(xhr.responseText));
}
};
xhr.send();

这种写法可读性较差,且多个异步操作嵌套时会形成 回调地狱。

而 Promise 允许我们以更清晰的方式处理异步操作:

fetch(‘https://api.example.com/data’)
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));

Axios 也是采用 Promise 方式 来封装 XMLHttpRequest,避免了回调地狱,并提供更强的扩展性。


  1. Axios 如何使用 Promise

Axios 的核心方法 axios(config) 或 axios.get(url) 返回的其实是一个 Promise:

axios.get(‘https://api.example.com/data’)
.then(response => {
console.log(response.data); // 请求成功时处理数据
})
.catch(error => {
console.error(error); // 请求失败时捕获错误
});

从外部使用上,Axios 提供了标准的 Promise 语法,可以使用 .then() 处理成功结果,使用 .catch() 处理错误,还可以使用 .finally() 进行清理工作。


  1. Axios 内部基于 Promise 处理请求

Axios 在内部通过 Promise.resolve(config) 让请求流程变成一个 Promise 链:

Axios.prototype.request = function (config) {
let promise = Promise.resolve(config);

// 处理拦截器
const chain = [dispatchRequest, undefined]; // 发送请求的函数

this.interceptors.request.forEach(interceptor => {
chain.unshift(interceptor.fulfilled, interceptor.rejected);
});

this.interceptors.response.forEach(interceptor => {
chain.push(interceptor.fulfilled, interceptor.rejected);
});

while (chain.length) {
promise = promise.then(chain.shift(), chain.shift());
}

return promise;
};

Promise.resolve(config) 确保整个流程是异步执行的。

chain 维护一个拦截器队列,使得 请求拦截器 -> 发送请求 -> 响应拦截器 形成一个 Promise 链。

最终,返回的 Promise 允许调用 .then()、.catch() 处理异步逻辑。


  1. 支持 Promise 并发操作

Axios 还支持 axios.all() 进行多个异步请求的并发处理:

axios.all([
axios.get(’/user’),
axios.get(’/orders’)
])
.then(axios.spread((user, orders) => {
console.log(user.data, orders.data);
}))
.catch(error => console.error(error));

axios.all() 的本质是基于 Promise.all(),它会并行执行多个请求,并在所有请求完成后返回结果。


  1. 总结

  2. Axios 采用 Promise 进行封装,避免了 XMLHttpRequest 的回调嵌套问题,使代码更加简洁。

  3. 内部基于 Promise 处理请求拦截器、发送请求、响应拦截器,形成完整的 Promise 链。

  4. 返回标准 Promise 对象,支持 .then() 处理成功结果,.catch() 处理错误,.finally() 进行清理。

  5. 支持 Promise 并发操作,比如 axios.all(),提升异步操作的能力。

因此,Axios 是 基于 Promise 设计的 HTTP 客户端,它利用 Promise 提供的链式调用、错误处理、并发能力,让网络请求管理更加优雅。


Axios 被称为 HTTP 客户端,主要是因为它封装了 HTTP 请求 的发送、处理和管理,提供了类似于浏览器 fetch 或 XMLHttpRequest 的功能,但比原生 API 更强大和易用。以下是 Axios 作为 HTTP 客户端 的关键特性:


  1. Axios 是一个 HTTP 客户端

Axios 主要用于 向服务器发送 HTTP 请求 并 处理 HTTP 响应,它支持:

GET(获取资源)

POST(提交数据)

PUT(更新数据)

DELETE(删除数据)

PATCH(部分更新)

以及 HEAD、OPTIONS 等请求方法

示例:

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

这个请求会发送 GET 请求到 https://api.example.com/users,然后 Axios 作为 HTTP 客户端 处理返回的响应。


  1. Axios 依赖 HTTP 协议

Axios 本质上是对 HTTP 协议的封装:

在 浏览器环境 下,使用 XMLHttpRequest 发送 HTTP 请求。

在 Node.js 环境 下,使用 http 或 https 模块发送 HTTP 请求。

适配器示例:

const adapter = typeof XMLHttpRequest !== ‘undefined’ ? xhrAdapter : httpAdapter;

Axios 自动选择合适的 HTTP 传输方式,确保在不同环境下都能发送 HTTP 请求。


  1. Axios 处理 HTTP 请求与响应

Axios 作为 HTTP 客户端,提供了请求和响应处理功能,包括:

请求拦截(修改请求,例如添加 token)

自动解析 JSON

处理 HTTP 状态码

错误处理

请求超时控制

跨域请求

示例:

axios.interceptors.request.use(config => {
config.headers.Authorization = ‘Bearer token’;
return config;
});

这里的拦截器为 HTTP 请求 添加身份验证头部,这正是 HTTP 客户端的常见功能之一。


  1. Axios 提供 HTTP 相关功能

Axios 作为 HTTP 客户端,提供了一些常见的 HTTP 相关功能:

  1. 自动解析响应数据

axios.get(’/data’).then(response => console.log(response.data));

Axios 自动将 JSON 响应解析为 JavaScript 对象,而 XMLHttpRequest 需要手动 JSON.parse(responseText)。

  1. 请求超时控制

axios.get(’/slow-api’, { timeout: 5000 })
.catch(error => console.log(‘请求超时’, error));

超过 5s 后会自动取消请求。

  1. 设置请求头

axios.post(’/submit’, data, {
headers: { ‘Content-Type’: ‘application/json’ }
});

可以轻松设置 HTTP 头部。

  1. 取消 HTTP 请求

const controller = new AbortController();
axios.get(’/data’, { signal: controller.signal });

// 取消请求
controller.abort();

这在处理 防抖 和 组件卸载时清理请求 时非常有用。

  1. 支持并发请求

axios.all([
axios.get(’/user’),
axios.get(’/posts’)
]).then(axios.spread((user, posts) => {
console.log(user.data, posts.data);
}));

Axios 允许多个 HTTP 请求 并行执行,然后合并结果。


  1. 总结

Axios 是 HTTP 客户端,因为:

  1. 它的核心功能是发送 HTTP 请求(如 GET、POST)。

  2. 它基于 HTTP 协议,支持 HTTP 头部、状态码、跨域等特性。

  3. 它封装了底层 HTTP 请求逻辑,在浏览器用 XMLHttpRequest,在 Node.js 用 http 模块。

  4. 它提供了完整的 HTTP 请求生命周期管理(拦截、超时、错误处理等)。

  5. 它能处理多个 HTTP 请求的并发、取消、自动解析等增强功能。

因此,Axios 是一个 强大、灵活、易用的 HTTP 客户端,让开发者可以更高效地与后端 API 进行交互。

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

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

相关文章

3.0 Disruptor的使用介绍(一)

Disruptor: 其官网定义为:“A High Performance Inter-Thread Messaging Library”,即:线程间的高性能消息框架,与Labview的生产者、消费者模型很相似。 其组成部分比较多,先介绍几个常用的概念: …

ubuntu 2204键盘按键映射修改

键盘的按键和实际输出不一致&#xff0c;可以通过以下方法重新修改按键keycode. 1.在终端执行如下命令&#xff1a; xev -event keyboard 上边64是alt_l&#xff0c;但是键盘上对应的super(windows)。 2.vim /usr/share/X11/xkb/keycodes/evdev //<LALT> 64; 注释&l…

【Linux】System V共享内存:零拷贝加速进程通信!

引言 本文深入探讨System V IPC中的共享内存技术&#xff0c;涵盖其原理、操作步骤、实现细节及与其他IPC机制的关系&#xff0c;助力读者全面掌握这一高效进程间通信方式。 &#x1f4dd; 文章总结&#xff1a; 共享内存原理 System V共享内存通过让多个进程共享同一物理内存区…

UE4学习笔记 FPS游戏制作31 显示计分板

一 制作计分板 创建一个RankPanel的UI蓝图 在蓝图里拖入如下物体 覆层&#xff08;layout&#xff09;&#xff1a;让子物体跟随自己缩放&#xff0c;子物体需要设置为拉伸模式&#xff0c;有点类似于的panel&#xff0c;本身只是一个容器 调整各个物体 覆层&#xff1a; 锚…

如何在Linux CentOS上安装和配置Redis

如何在Linux CentOS上安装和配置Redis 大家好&#xff0c;我是曾续缘。欢迎来到本教程&#xff01;今天我将向您介绍在Linux CentOS上安装和配置Redis的详细步骤。Redis是一个高性能的键值存储系统&#xff0c;常用于缓存、消息队列和数据持久化等应用场景。让我们一起开始吧&…

Realsense-D400 系列手动曝光控制

文章目录 1、曝光 & 增益2、曝光 & 帧率3、调参 & 加载4、高级控制选项5、官方文档参考小结 1、曝光 & 增益 曝光exposure&#xff1a;英特尔 RealSense D400设备模组中的可见光 RGB 传感器和红外左右目传感器具有单独的曝光控制&#xff0c;对于双目红外&…

最大异或对 The XOR Largest Pair

题目来自洛谷网站&#xff1a; 思路&#xff1a; 两个循环时间复杂度太高了&#xff0c;会超时。 我们可以先将读入的数字&#xff0c;插入到字典树中&#xff0c;从高位到低位。对每个数查询的时候&#xff0c;题目要求是最大的异或对&#xff0c;所以我们选择相反的路径&am…

探索 curl ipinfo.io:从命令行获取你的网络身份卡!!!

&#x1f310; 探索 curl ipinfo.io&#xff1a;从命令行获取你的网络身份卡 &#x1faaa; &#x1f680; 简介&#xff1a;为什么需要 curl ipinfo.io&#xff1f; 当你在调试网络服务、排查访问限制或开发基于地理位置的应用时&#xff0c;公网 IP 信息就像一张网络身份证。…

Chrome(Google) 浏览器安装Vue2、Vue3 Devtools插件方法

方式一&#xff1a;本地下载安装 步骤一&#xff1a;下载 网站:极简插件官网_Chrome插件下载_Chrome浏览器应用商店 步骤二&#xff1a;下载后解压,并拖入浏览器扩展页面&#xff0c;安装插件后&#xff0c;重启浏览器。 步骤三&#xff1a;查看是否安装成功 方式二&#x…

树莓派超全系列文档--(7)RaspberryOS播放音频和视频

播放音频和视频 播放音频和视频VLC 媒体播放器vlc GUIvlc CLI使用 cvlc 在没有图形用户界面的情况下播放媒体 在 Raspberry Pi OS Lite 上播放音频和视频指定音频输出设备指定视频输出设备同时指定音频和视频输出设备提高数据流播放性能 文章来源&#xff1a; http://raspberr…

MySQL 8.0.41安装教程(附安装包)mysql8.0.41图文详细安装教程

文章目录 前言一、MySQL 8.0.41下载安装包二、MySQL 8.0.41安装教程1.启动安装程序2.选择安装模式3.选定安装组件4.确认安装设置5.执行安装操作6.安装进行中7.设置数据库密码8.继续点击下一步9.执行配置操作10.完成配置11. 再次点击下一步12.结束安装向导 三、MySQL 8.0.41配置…

centos7 linux VMware虚拟机新添加的网卡,能看到网卡名称,但是看不到网卡的配置文件

问题现象&#xff1a;VMware虚拟机新添加的网卡&#xff0c;能看到网卡&#xff0c;但是看不到网卡的配置文件 解决方案&#xff1a; nmcli connection show nmcli connection add con-name ens36 ifname ens36 type ethernet #创建一个网卡连接配置文件&#xff0c;这里con…

【LVS】负载均衡群集部署(DR模式)

部署前IP分配 DR服务器&#xff1a;192.168.166.101 vip&#xff1a;192.168.166.100 Web服务器1&#xff1a;192.168.166.104 vip&#xff1a;192.168.166.100 Web服务器2&#xff1a;192.168.166.107 vip&#xff1a;192.168.166.100 NFS服务器&#xff1a;192.168.166.108 …

服务器与客户端通讯测试

服务器与客户端通讯测试 1 服务器与客户端通讯建立1.1 Main函数1.2 开启服务器1.3 客户端连接服务器1.4 扩展类 2 测试过程2.1 测试12.2 测试22.3 测试32.4 测试4 3 测试总结 测试服务器与客户端通讯时&#xff0c;发现数据丢包问题非常严重&#xff0c;肯定是自己的问题不会是…

Next.js 中间件鉴权绕过漏洞 (CVE-2025-29927) 复现利用与原理分析

免责声明 本文所述漏洞复现方法仅供安全研究及授权测试使用&#xff1b; 任何个人/组织须在合法合规前提下实施&#xff0c;严禁用于非法目的&#xff1b; 作者不对任何滥用行为及后果负责&#xff0c;如发现新漏洞请及时联系厂商并遵循漏洞披露规则。 漏洞原理 Next.js 是一个…

基于STC89C51的太阳自动跟踪系统的设计与实现—单片机控制步进电机实现太阳跟踪控制(仿真+程序+原理图+PCB+文档)

摘 要 随着我国经济的飞速发展&#xff0c;促使各种能源使用入不敷出&#xff0c;尤其是最主要的能源&#xff0c;煤炭石油资源不断消耗与短缺&#xff0c;因此人类寻找其他替代能源的脚步正在加快。而太阳能则具有无污染﹑可再生﹑储量大等优点&#xff0c;且分布范围广&…

在 Mermaid 流程图里“驯服”quot;的魔法指南!!!

&#x1f409; 在 Mermaid 流程图里“驯服”"的魔法指南 在使用 Mermaid 画流程图时&#xff0c;是不是经常遇到想秀一波 &quot; 却被它“反杀”的情况&#xff1f;&#x1f3af; 今天就来教大家如何在这头代码野兽的嘴里&#xff0c;抢回我们的双引号实体编码&#…

SQL语句---DDL

文章目录 1、SQL语句2、DDL2.1 数据库的操作显示当前的数据库创建数据库指定编码删除数据库切换当前数据库 2.2 数据表的操作显示表创建表显示表结构修改表添加新的字段删除原有字段 修改原有字段删除数据表 2.3 Mysql数据库中常用的数据类型 1、SQL语句 结构化查询语句&#…

界面控件Telerik和Kendo UI 2025 Q1亮点——AI集成与数据可视化

Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库&#xff0c;加快开发速度。Telerik DevCraft提供完整的工具箱&#xff0c;用于构建现代和面向未来的业务应用程序&#xff0c;目前提供UI for ASP.NET MVC、Kendo…

信源的分类及数学模型

信源的分类及数学模型 按照信源发出的时间和消息分布分为离散信源和连续信源 按照信源发出符号之间的关系分为无记忆信源和有记忆信源 单符号离散信源&#xff08;一维离散信源&#xff09; 信源输出的消息数有限或可数&#xff0c;且每次只输出符号集的一个消息 样本空间&…