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

Fetch与Axios:区别、联系、优缺点及使用差异

Fetch与Axios:区别、联系、优缺点及使用差异

文章目录

  • Fetch与Axios:区别、联系、优缺点及使用差异
    • 一、联系
    • 二、区别
      • 1. 浏览器支持与兼容性
      • 2. 响应处理
      • 3. 请求拦截和响应拦截
      • 4. 错误处理
    • 三、优缺点
      • 1. Fetch API
        • 优点
        • 缺点
      • 2. Axios
        • 优点
        • 缺点
    • 四、使用上的差异和特性
      • 1. 发送POST请求
      • 2. 取消请求
    • 总结

在现代Web开发中,数据交互是必不可少的环节。Fetch API和Axios是两种常用的HTTP客户端工具,用于在浏览器和Node.js环境中发起HTTP请求。下面我们来详细探讨它们的区别、联系、优缺点以及使用上的差异。

一、联系

Fetch API和Axios的主要目的都是发起HTTP请求,实现客户端与服务器之间的数据交互。它们都支持常见的HTTP方法,如GET、POST、PUT、DELETE等,并且可以处理各种类型的响应数据,如JSON、文本、二进制数据等。

二、区别

1. 浏览器支持与兼容性

  • Fetch API:是现代浏览器原生支持的API,无需额外引入库。但在旧版本的浏览器(如IE)中不支持,需要使用polyfill来实现兼容性。
  • Axios:是一个第三方库,需要引入才能使用。它支持所有主流浏览器,包括旧版本的IE,并且在Node.js环境中也能使用。

2. 响应处理

  • Fetch API:返回的是一个Promise对象,需要手动解析响应数据。例如,要获取JSON格式的响应数据,需要调用response.json()方法。
fetch('https://api.example.com/data').then(response => response.json()).then(data => console.log(data)).catch(error => console.error(error));
  • Axios:会自动解析响应数据,默认情况下返回的就是解析后的JSON对象。
axios.get('https://api.example.com/data').then(response => console.log(response.data)).catch(error => console.error(error));

3. 请求拦截和响应拦截

  • Fetch API:本身不支持请求拦截和响应拦截,需要手动实现。
  • Axios:内置了请求拦截和响应拦截功能,可以在请求发送前和响应返回后进行一些处理,如添加请求头、错误处理等。
// 请求拦截
axios.interceptors.request.use(config => {// 在发送请求之前做些什么config.headers.Authorization = 'Bearer ' + token;return config;
}, error => {// 对请求错误做些什么return Promise.reject(error);
});// 响应拦截
axios.interceptors.response.use(response => {// 对响应数据做点什么return response;
}, error => {// 对响应错误做点什么return Promise.reject(error);
});

4. 错误处理

  • Fetch API:只有在网络请求失败时才会reject Promise,即使服务器返回404、500等状态码,Promise仍然会resolve。需要手动检查response.ok属性来判断请求是否成功。
fetch('https://api.example.com/data').then(response => {if (!response.ok) {throw new Error('Network response was not ok');}return response.json();}).then(data => console.log(data)).catch(error => console.error(error));
  • Axios:在请求失败时会reject Promise,并且会包含详细的错误信息,如状态码、错误消息等。
axios.get('https://api.example.com/data').then(response => console.log(response.data)).catch(error => {if (error.response) {// 请求已发出,但服务器响应状态码不在 2xx 范围内console.log(error.response.data);console.log(error.response.status);console.log(error.response.headers);} else if (error.request) {// 请求已发出,但没有收到响应console.log(error.request);} else {// 其他错误console.log('Error', error.message);}});

三、优缺点

1. Fetch API

优点
  • 原生支持,无需引入额外库,减少项目体积。
  • 语法简洁,符合现代JavaScript的Promise风格。
缺点
  • 浏览器兼容性差,需要polyfill。
  • 响应处理繁琐,需要手动解析。
  • 错误处理不够直观。

2. Axios

优点
  • 支持所有主流浏览器和Node.js环境。
  • 内置请求拦截和响应拦截功能,方便处理请求和响应。
  • 自动解析响应数据,错误处理更完善。
  • 支持取消请求、自动转换JSON数据等功能。
缺点
  • 需要引入第三方库,增加项目体积。

四、使用上的差异和特性

1. 发送POST请求

  • Fetch API
fetch('https://api.example.com/data', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ key: 'value' })
}).then(response => response.json()).then(data => console.log(data)).catch(error => console.error(error));
  • Axios
axios.post('https://api.example.com/data', { key: 'value' }).then(response => console.log(response.data)).catch(error => console.error(error));

2. 取消请求

  • Fetch API:使用AbortController实现超时取消请求。
const controller = new AbortController();
const signal = controller.signal;// 设置超时时间为3000毫秒
const timeoutId = setTimeout(() => {controller.abort();
}, 3000);fetch('https://api.example.com/data', { signal }).then(response => {clearTimeout(timeoutId);return response.json();}).then(data => console.log(data)).catch(error => {if (error.name === 'AbortError') {console.log('请求超时被取消');} else {console.error(error);}});
  • Axios:使用CancelToken实现超时取消请求。
const CancelToken = axios.CancelToken;
const source = CancelToken.source();// 设置超时时间为3000毫秒
const timeoutId = setTimeout(() => {source.cancel('请求超时被取消');
}, 3000);axios.get('https://api.example.com/data', {cancelToken: source.token
}).then(response => {clearTimeout(timeoutId);console.log(response.data);}).catch(error => {if (axios.isCancel(error)) {console.log(error.message);} else {console.error(error);}});

总结

Fetch API和Axios各有优缺点,选择使用哪一个取决于项目的具体需求。如果项目对浏览器兼容性要求不高,且希望减少依赖,可以选择Fetch API;如果需要处理复杂的请求和响应,或者需要支持旧版本的浏览器,Axios是更好的选择。

相关文章:

Fetch与Axios:区别、联系、优缺点及使用差异

Fetch与Axios:区别、联系、优缺点及使用差异 文章目录 Fetch与Axios:区别、联系、优缺点及使用差异一、联系二、区别1. 浏览器支持与兼容性2. 响应处理3. 请求拦截和响应拦截4. 错误处理 三、优缺点1. Fetch API优点缺点 2. Axios优点缺点 四、使用上的差…...

YOLO11解决方案之分析

概述 Ultralytics提供了一系列的解决方案,利用YOLO11解决现实世界的问题,包括物体计数、模糊处理、热力图、安防系统、速度估计、物体追踪等多个方面的应用。 Ultralytics提供了三种基本的数据可视化类型:折线图(面积图&#xf…...

yolov11与双目测距结合,实现目标的识别和定位测距(onnx版本)

一、yolov11双目测距基本流程 yolov11 双目测距的大致流程就是: 双目标定 --> 立体校正(含消除畸变) --> 立体匹配 --> 视差计算 --> 深度计算(3D坐标)计算 --> 目标检测 --> 目标距离计算及可视化 下面将分别阐述每…...

基于51单片机和8X8点阵屏、独立按键的填充消除类小游戏

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、8X8点阵屏2、独立按键3、定时器04、定时器1 四、主函数总结 系列文章目录 前言 使用的是普中A2开发板。 【单片机】STC89C52RC 【频率】12T11.0592MHz 【外设】8X8点阵屏、独立按键 效果查看/操作演示&#x…...

将数据库表导出为C#实体对象

数据库方式 use 数据库;declare TableName sysname 表名 declare Result varchar(max) /// <summary> /// TableName /// </summary> public class TableName {select Result Result /// <summary>/// CONVERT(NVARCHAR(500), ISNULL(ColN…...

物联网技术发展与应用研究分析

文章目录 引言一、物联网的基本架构&#xff08;一&#xff09;感知层&#xff08;二&#xff09;网络层&#xff08;三&#xff09;平台层&#xff08;四&#xff09;应用层 二、物联网的关键技术&#xff08;一&#xff09;传感器技术&#xff08;二&#xff09;通信技术&…...

金融系统渗透测试

金融系统渗透测试是保障金融机构网络安全的核心环节&#xff0c;它的核心目标是通过模拟攻击手段主动发现系统漏洞&#xff0c;防范数据泄露、资金盗取等重大风险。 一、金融系统渗透测试的核心框架 合规性驱动 需严格遵循《网络安全法》《数据安全法》及金融行业监管要求&am…...

C++ 信息学奥赛总复习题

第一章 C 基础语法 一、填空题 C 源文件的扩展名通常是______。C 程序的入口函数是______。在 C 中&#xff0c;注释有两种形式&#xff0c;分别是______和______。声明一个整型变量 a 的语句是______。输出语句的关键字是______。 二、判断题 C 区分大小写。&#xff08; …...

9.进程间通信

1.简介 为啥要有进程间通信&#xff1f; 如果未来进程之间要协同呢&#xff1f;一个进程要把自己的数据交给另一个进程&#xff01;进程是具有独立性的&#xff0c;所以把一个进程的数据交给另一个进程----基本不可能&#xff01;必须通信起来&#xff0c;就必须要有另一个人…...

性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断

&#x1f680; 性能剖析&#xff1a;在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断 &#x1f4da; 目录 &#x1f680; 性能剖析&#xff1a;在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断一、为什么选择 MiniProfiler&#xff1f; &#x1f9d0;二、集成 MiniProf…...

React 基础入门笔记

一、JSX语法规则 1. 定义虚拟DOM时&#xff0c;不要写引号 2.标签中混入JS表达式时要用 {} &#xff08;1&#xff09;.JS表达式与JS语句&#xff08;代码&#xff09;的区别 &#xff08;2&#xff09;.使用案例 3.样式的类名指定不要用class&#xff0c;要用className 4.内…...

C++.OpenGL (12/64)光照贴图(Lightmaps)

光照贴图(Lightmaps) 静态光照烘焙技术 #mermaid-svg-1vJKLLr1zSCp1ASH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1vJKLLr1zSCp1ASH .error-icon{fill:#552222;}#mermaid-svg-1vJKLLr1zSCp1ASH .error-text…...

压测软件-Jmeter

1 下载和安装 1.1 检查运行环境 Jmeter需要运行在java环境&#xff08;JRE 或 JDK&#xff09;中 在window的"命令提示窗"查看安装的java版本: java -version 1.2 下载Jmeter 从Apache官网下载Jmeter安装包 1.3 解压和运行 解压后,进入bin文件夹,双击jmeter.bat即可…...

Linux 常用命令语法总结

Linux 常用命令语法总结 1. 文件和目录操作 1.1 基本文件操作 # 列出文件和目录 ls # 列出当前目录内容 ls -l # 详细列表格式 ls -la # 显示隐藏文件 ls -lh # 人性化显示文件大小 ls...

青少年编程与数学 01-011 系统软件简介 02 UNIX操作系统

青少年编程与数学 01-011 系统软件简介 02 UNIX操作系统 一、UNIX的历史沿革二、UNIX系统架构三、UNIX主要特性四、UNIX分支与变种五、UNIX设计哲学六、UNIX的影响与遗产 **摘要&#xff1a;**UNIX操作系统是现代计算领域最具影响力的操作系统之一&#xff0c;其设计哲学和技术…...

NLP学习路线图(三十):微调策略

在自然语言处理领域,预训练语言模型(如BERT、GPT、T5)已成为基础设施。但如何让这些“通才”模型蜕变为特定任务的“专家”?微调策略正是关键所在。本文将深入剖析七种核心微调技术及其演进逻辑。 一、基础概念:为什么需要微调? 预训练模型在海量语料上学习了通用语言表…...

leetcode刷题日记——1.组合总和

解答&#xff1a; class Solution { public:void dfs(vector<int>& candidates, int target, vector<vector<int>>& ans, vector<int>& combine, int idx) {if(idxcandidates.size()){//遍历完的边界return;}if(target0){//找完了能组成和…...

关于单片机的基础知识(一)

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于单片机基础知识的相关内容&#xf…...

Python训练营打卡Day45

知识点回顾&#xff1a; tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战&#xff1a;MLP和CNN模型 效果展示如下&#xff0c;很适合拿去组会汇报撑页数&#xff1a; 作业&#xff1a;对resnet18在cifar10上采用微调策略下&#xff0c;用tensorbo…...

Xilinx FPGA 重构Multiboot ICAPE2和ICAPE3使用

一、FPGA Multiboot 本文主要介绍基于IPROG命令的FPGA多版本重构&#xff0c;用ICAP原语实现在线多版本切换。需要了解MultiBoot Fallback点击链接。 如下图所示&#xff0c;ICAP原语可实现flash中n1各版本的动态切换&#xff0c;在工作过程中&#xff0c;可以通过IPROG命令切…...

Redis专题-基础篇

题记 本文涵盖了Redis的各种数据结构和命令&#xff0c;Redis的各种常见Java客户端的应用和最佳实践 jedis案例github地址&#xff1a;https://github.com/whltaoin/fedis_java_demo SpringbootDataRedis案例github地址&#xff1a;https://github.com/whltaoin/springbootData…...

springMVC-11 中文乱码处理

前言 本文介绍了springMVC中文乱码的解决方案&#xff0c;同时也贴出了本人遇到过的其他乱码情况&#xff0c;可以根据自身情况选择合适的解决方案。 其他-jdbc、前端、后端、jsp乱码的解决 Tomcat导致的乱码解决 自定义中文乱码过滤器 老方法&#xff0c;通过javaW…...

【iOS安全】iPhone X iOS 16.7.11 (20H360) WinRa1n 越狱教程

前言 越狱iPhone之后&#xff0c;一定记得安装一下用于屏蔽更新的描述文件&#xff08;可使用爱思助手&#xff09; 因为即便关闭了自动更新&#xff0c;iPhone仍会在某些时候自动更新系统&#xff0c;导致越狱失效&#xff1b;更为严重的是&#xff0c;更新后的iOS版本可能是…...

MongoDB检查慢查询db.system.profile.find 分析各参数的作用

db.system.profile.find() 是分析 MongoDB 性能的关键工具,其返回的文档包含丰富的性能指标。下面是对各参数的详细解释和优化建议: {"op": "query", // 操作类型(query/update/remove)"ns": "test.users", // 命名…...

智能标志桩图像监测装置如何守护地下电缆安全

在现代城市基础设施建设中&#xff0c;大量电缆、管道被埋设于地下&#xff0c;这虽然美化了城市景观&#xff0c;却也带来了新的安全隐患。施工挖掘时的意外破坏、自然灾害的影响&#xff0c;都可能威胁这些"城市血管"的安全运行。 传统的地下设施标识方式往往只依…...

【网站建设】网站 SEO 中 meta 信息修改全攻略 ✅

在做 SEO 优化时,除了前一篇提过的Title之外,meta 信息(通常指 <meta> 标签)也是最基础、最重要的内容之一,主要包括: <meta name="description"> <meta name="keywords"> 搜索引擎重点参考这些信息,决定你网页的展示效果与排名。…...

计算机视觉处理----OpenCV(从摄像头采集视频、视频处理与视频录制)

一、采集视频 VideoCapture 用于从视频文件、摄像头或其他视频流设备中读取视频帧。它可以捕捉来自 多种源的视频。 cv2.VideoCapture() 打开摄像头或视频文件。 cap cv2.VideoCapture(0) # 0表示默认摄像头&#xff0c;1是第二个摄像头&#xff0c;传递视频文件路径也可以 …...

elasticsearch基本操作笔记

1.通过kibana查看elasticsearch版本信息 a.左上角三道横->Management->Dev Tools b.GET / 执行 c.执行结果 { “name” : “xxxx”, “cluster_name” : “xxxxxxx”, “cluster_uuid” : “vl1UudAoQp-aHWAzyPoMyw”, “version” : { “number” : “7.15.1”, “build…...

LVGL手势识别事件无上报问题处理记录

最近在使用LVGL8.3开源库开源UI界面时,碰到使用FB驱动显示UI时,触摸屏手势识别事件接收不到的情况,通过如下调整可以处理该问题: 1、创建Top Object时,不能使用如下语句: lv_obj_t *page_obj = lv_obj_create(lv_scr_act()); 而要使用如下语句: lv_obj_t *page_obj =…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- 第一篇:MIPI CSI-2基础入门

第一篇&#xff1a;MIPI CSI-2基础入门 1. 为什么需要CSI-2&#xff1f; 痛点场景对比 &#xff08;用生活案例降低理解门槛&#xff09; 传统并行接口CSI-2接口30根线传输720P图像仅需5根线&#xff08;1对CLK4对DATA&#xff09;线距&#xff1e;5cm时出现重影线缆可长达1…...