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是更好的选择。

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

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

相关文章

【Docker】快速入门与项目部署实战

我们在部署一个项目时,会出现一系列问题比如: 命令太多了,记不住软件安装包名字复杂,不知道去哪里找安装和部署步骤复杂,容易出错 其实上述问题不仅仅是新手,即便是运维在安装、部署的时候一样会觉得麻烦…

Java面试题尚硅谷版第1季

1、写出如下代码运行结果 1.1、 使用局部变量表和操作数栈解题 1.2、使用前置和后置递增解题 2、写一个单例模式 2.1、考察知识点 2.2、单例模式实现 3、类加载和初始化顺序 package classload;public class Father {private int i test();private static int j method();st…

关于Qt阻断样式继承的解决办法

引言 在使用 Qt 开发桌面应用时,借助样式表(StyleSheet)来统一定义界面风格是非常常见的做法。通常,你会在主程序中通过 qApp->setStyleSheet(...) 或者直接给某个父控件设置样式表,让所有的子控件都采用相同的配色…

鼠标右键添加新建某种文件的方法

场景 我经常用到.emmx,.eddx文件,电脑上装的是wpsX亿图(因为有wps会员),没有开亿图会员。 然后问题就是,思维导图和流程图我都能正常开,正常编辑,但鼠标右键没有新建这两个文件的按…

Inxpect安全雷达传感器与控制器:动态检测 + 抗干扰技术重构工业安全防护体系

Inxpect 推出工业安全领域新型智能传感器与控制器,其核心产品为雷达扫描仪,具备动态调整检测区域、抗干扰能力强等特点,可精准检测危险区域人员进入或存在情况,适用于移动机器人等场景。 Inxpect安全雷达传感器核心功能 动态检测…

【AI学习】李广密与阶跃星辰首席科学家张祥雨对谈:多模态发展的历史和未来

仔细阅读了文章《专访张祥雨:多模态推理和自主学习是未来的 2 个 「GPT-4」 时刻》 https://mp.weixin.qq.com/s/892QuRPH9uP6zN6dS-HZMw 非常赞叹的一篇文章,说清楚了NLP、CV发展中的许多重大问题,读来醍醐灌顶!这样的文章&…

C++中std::deque详解和实战工程代码示例

C中std::deque详解和实战工程代码示例 std::deque(双端队列)是 C 标准库中的一个序列容器,与 std::vector 类似,但它支持从头部和尾部高效地插入和删除元素。它底层采用分段连续空间实现,兼具灵活性与性能。 一、基本…

【AI大模型入门指南】概念与专有名词详解 (二)

【AI大模型入门指南】概念与专有名词详解 (二) 一 、前言 当你和聊天机器人聊得天花乱坠时,当你用文字让AI生成精美图片时,当手机相册自动帮你分类照片时 —— 这些看似智能的操作背后,都藏着 AI 大模型的身影。 本…

AIStor 的模型上下文协议 (MCP) 服务器:管理功能

在本系列的上一篇博文中,我们讨论了 MinIO AIStor 的模型上下文协议 (MCP) 服务器的基本用户级功能。我们学习了如何使用人类语言命令查看存储桶的内容、分析对象并标记它们以便将来处理,以及如何通过 LLM(例如 Anthropic Claude)…

期权末日轮实值期权盈利未平仓怎么办?

本文主要介绍期权末日轮实值期权盈利未平仓怎么办?期权末日轮实值期权盈利未平仓该怎么办,需要明确几个关键点:末日轮指的是期权到期日临近的时候,通常指最后一周,尤其是最后一天,这时候时间价值衰减很快&a…

C++/Qt 联合编程中的定时器使用陷阱:QObject::startTimer 报错详解

在 Qt 开发中,QTimer 是一个常用的工具类,用于处理定时事件。但不少开发者在 C/Qt 联合编程,尤其是在工具类、静态类、线程中使用定时器时,会遇到如下令人困惑的报错: QObject::startTimer: Timers can only be used …

CentOS7.9 查询运维安全日志,排查恶意用户

1、查看系统版本 cat /etc/redhat-release uname -a 2、查看所有账号 cat /etc/shadow 3、修改 root 密码 passwd 3、查看账号ID id jinzhi 4、查看登录日志 lastlog 5、查看操作日志 cat .bash_history sudo cat /home/yunwei/.bash_history sudo grep root /va…

多模态大语言模型arxiv论文略读(117)

Training-free Zero-shot Composed Image Retrieval via Weighted Modality Fusion and Similarity ➡️ 论文标题:Training-free Zero-shot Composed Image Retrieval via Weighted Modality Fusion and Similarity ➡️ 论文作者:Ren-Di Wu, Yu-Yen L…

如何正确的配置eureka server集群

将 Eureka Server 实例的 hostname 都配置成相同的值,在 Eureka Server 集群环境下同样是不推荐且通常会导致严重问题的, 核心问题:Eureka Server 集群的工作机制 Eureka Server 集群通过相互注册(Peering)来实现高可…

AI支持下的-ArcGIS数据处理、空间分析、可视化及多案例综合应用

查看原文>>> 从入门到精通-AI支持下的-ArcGIS数据处理、空间分析、可视化及多案例综合应用 结合ArcGIS和GPT的优势,本文重点进行AI大模型应用、ArcGIS工作流程及功能、Prompt使用技巧、AI助力工作流程、AI助力数据读取与处理、AI助力空间分析、AI助力遥感…

vue3-ts: v-model 和 props 的关系

在 Vue.js 中,v-model 是一个语法糖,它实际上是 :value 和 input 事件的组合。 当你使用 v-model 绑定一个组件时,默认情况下,组件会通过 props 接收 value 这个 prop, 并通过触发 input 事件来更新父组件中的数据。 …

学车笔记 变挡

超15就可以加一档了 有些人对手动挡的档位有一些误解_哔哩哔哩_bilibili 献给所有新司机.开手动档摆脱顿挫的根本方法.学会看转速!没那么复杂!_哔哩哔哩_bilibili 减速到怠速降一档

STM32的DMA简介

STM32的DMA简介 一、DMA概述 DMA(Direct Memory Access,直接存储器存取)是一种硬件机制,它允许外设和存储器之间或者存储器和存储器之间进行高速数据传输,而无需CPU的干预。这种机制可以极大地节省CPU资源&#xff0c…

Spring-AOP知识点

一、AOP简介 1.AOP概念 2.AOP思想实现方案 3.AOP相关概念 二、基于xml配置AOP 1.快速入门 2.AOP配置详解 3.AOP原理剖析 三、基于注解配置AOP 1.快速入门 2.注解方式AOP配置详解 抽取切点表达式

Java@Data 与 @NotNull 注解冲突问题

第一章:核心概念解析 1. Data(Lombok 提供) 自动生成以下方法: gettersettertoString()equals()hashCode() 简化实体类编写,提高开发效率。 示例: import lombok.Data;Data public class User {private…