WHAT - xmlhttprequest vs fetch vs wretch
目录
- 前言
- 1. XMLHttpRequest (XHR)
- 2. fetch
- 3. wretch
- 总结
- fetch
- 1. 简洁性和易用性
- 2. 错误处理
- 3. 默认行为和功能扩展
- 4. 请求和响应的处理
- 5. 跨域请求和 CORS
- 6. 现代 Web 开发需求
- fetch vs xhr 代码示例
- 使用 XMLHttpRequest
- 使用 fetch
- 代码对比
前言
根据标题我们可以知道今天主要介绍三个内容:xmlhttprequest、fetch、wretch。这几个工具都是用于在 JavaScript 中进行 HTTP 请求的,但是它们有不同的特点和使用场景。我们来逐一分析。
1. XMLHttpRequest (XHR)
官方文档
-
特点:
- 这是一个较老的 API,用于在浏览器中进行 HTTP 请求。
- 支持同步和异步请求(虽然同步请求在现代浏览器中已不推荐使用)。
- 配置和使用相对复杂,需要处理更多的回调和状态管理。
-
示例:
var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://api.example.com/data', true); xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {console.log(xhr.responseText);} }; xhr.send();
2. fetch
官方文档
-
特点:
- 是现代浏览器中推荐使用的 API,用于进行 HTTP 请求。
- 基于 Promises,支持链式调用和更简洁的语法。
- 默认情况下只处理 HTTP 响应的状态码,不会自动抛出错误,需手动检查响应的状态。
-
示例:
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('There was a problem with your fetch operation:', error));
3. wretch
官方文档
-
特点:
- 是一个第三方库,建立在
fetch之上,提供更强大的功能和更简洁的语法。 - 支持链式调用、请求拦截器、响应拦截器、自动解析 JSON 等。
- 可以通过插件和中间件扩展功能。
- 是一个第三方库,建立在
-
示例:
import wretch from 'wretch';wretch('https://api.example.com/data').get().json().then(data => console.log(data)).catch(error => console.error('There was a problem with your request:', error));
总结
XMLHttpRequest是较老的 API,适用于兼容性要求较高的场景,但使用起来较为复杂。fetch是现代的原生 API,提供了更简洁的语法和基于 Promises 的异步处理。wretch是一个基于fetch的库,进一步简化了 API,并提供了更多功能和灵活性,适用于需要更复杂请求处理的场景。
选择哪个工具取决于你的项目需求和个人偏好。如果你需要兼容旧浏览器或在已有代码中使用,XMLHttpRequest 可能是必要的。如果你倾向于现代化的编程风格,fetch 是推荐的选择。如果你想要额外的功能和更易用的 API,wretch 是一个很好的选择。
fetch
XMLHttpRequest (XHR) 在它推出的时代是处理浏览器中 HTTP 请求的主要方法,但随着技术的发展和需求的变化,开发者们发现了它的一些不足之处,这些不足促使了 fetch 规范的推出。
以下是一些主要原因:
1. 简洁性和易用性
-
XMLHttpRequest:- 处理回调函数和状态变化较复杂,需要手动管理许多状态和回调(如
onreadystatechange)。 - 语法较繁琐,需要额外的代码来检查请求状态和处理错误。
- 处理回调函数和状态变化较复杂,需要手动管理许多状态和回调(如
-
fetch:- 基于 Promises,使得异步代码的编写更简单、易读,支持链式调用。
- 更加简洁的语法,消除了繁琐的回调和状态管理。
2. 错误处理
-
XMLHttpRequest:- 错误处理依赖于检查
status代码,并且对于网络错误(如无法连接服务器)通常需要额外的逻辑来处理。
- 错误处理依赖于检查
-
fetch:- 主要依赖于 Promises 的
.catch()方法来处理请求错误。 - 只会对网络错误抛出异常,而 HTTP 错误状态(如 404 或 500)仍会被当作正常的响应处理,需要手动检查响应状态。
- 主要依赖于 Promises 的
3. 默认行为和功能扩展
-
XMLHttpRequest:- 不支持一些现代网络请求的功能,如流式处理。
- 处理 JSON 数据时需要手动解析,且不支持一些高级的请求功能。
-
fetch:- 内置了对流的支持,能够处理大数据的流式读取。
- 自动处理请求和响应的序列化和反序列化(如 JSON)。
4. 请求和响应的处理
-
XMLHttpRequest:- 处理请求和响应的流程相对复杂,需要设置多个事件处理函数。
-
fetch:- 通过一个简洁的 API 来配置请求,响应处理更为直接。
- 提供了更多灵活的配置选项,如自定义请求头和方法。
5. 跨域请求和 CORS
-
XMLHttpRequest:- 跨域请求的处理较复杂,需要配置 CORS 头部,并且有时需要处理更多的兼容性问题。
-
fetch:- 内置对 CORS 的支持,配置更简单,并且提供了更细粒度的控制。
6. 现代 Web 开发需求
-
XMLHttpRequest:- 设计时没有考虑到现代 Web 开发的一些需求,如更复杂的请求、响应流处理和更高效的异步处理。
-
fetch:- 设计时考虑了现代 Web 的需求,支持更复杂的请求和响应处理,更好地与现代 JavaScript 的异步处理模式(如 async/await)兼容。
总之,fetch 的推出是为了满足现代 Web 开发对更简洁、灵活和强大的 HTTP 请求处理的需求。它不仅改进了 XMLHttpRequest 的不足,还融入了更符合当前开发需求的设计理念。
fetch vs xhr 代码示例
下面是用 XMLHttpRequest 和 fetch 处理相同 HTTP 请求的代码示例。这将有助于比较它们的语法和处理方式。
使用 XMLHttpRequest
假设我们要从一个 API 获取 JSON 数据,并处理响应。
代码示例:
// 创建 XMLHttpRequest 对象
var xhr = new XMLHttpRequest();// 配置请求:GET 方法,请求 URL,异步方式
xhr.open('GET', 'https://api.example.com/data', true);// 设置响应类型为 JSON
xhr.responseType = 'json';// 监听请求状态变化
xhr.onreadystatechange = function() {if (xhr.readyState === 4) { // 请求完成if (xhr.status === 200) { // 请求成功console.log(xhr.response); // 打印响应数据} else {console.error('请求失败,状态码:', xhr.status);}}
};// 发送请求
xhr.send();
使用 fetch
代码示例:
// 使用 fetch 发起 GET 请求
fetch('https://api.example.com/data').then(response => {if (!response.ok) { // 检查响应状态throw new Error('网络响应不是 OK');}return response.json(); // 解析 JSON 数据}).then(data => {console.log(data); // 打印响应数据}).catch(error => {console.error('请求失败:', error); // 打印错误信息});
代码对比
-
创建请求:
XMLHttpRequest:需要创建一个对象,设置请求方法和 URL,调用open方法。fetch:直接调用fetch函数并传递 URL 和配置选项。
-
配置请求:
XMLHttpRequest:需要额外设置请求的响应类型,并处理请求的状态变化(使用onreadystatechange)。fetch:响应解析(如 JSON)通常在then链中处理,不需要配置响应类型。
-
处理响应:
XMLHttpRequest:需要检查readyState和status,然后手动解析响应。fetch:基于 Promises 的链式调用,自动处理解析和错误捕获,更直观。
-
错误处理:
XMLHttpRequest:通常需要自己处理各种可能的错误情况。fetch:通过catch捕获网络错误和其他异常,错误处理更为集中和简洁。
-
响应类型:
XMLHttpRequest:响应类型需手动设置(如responseType = 'json')。fetch:通常解析为 JSON 或其他格式(如response.text()),无须手动设置响应类型。
总体来说,fetch 提供了更现代和简洁的 API,使得 HTTP 请求的处理更为方便和直观。
相关文章:
WHAT - xmlhttprequest vs fetch vs wretch
目录 前言1. XMLHttpRequest (XHR)2. fetch3. wretch总结 fetch1. 简洁性和易用性2. 错误处理3. 默认行为和功能扩展4. 请求和响应的处理5. 跨域请求和 CORS6. 现代 Web 开发需求 fetch vs xhr 代码示例使用 XMLHttpRequest使用 fetch代码对比 前言 根据标题我们可以知道今天主…...
吴恩达老师机器学习作业-ex7(聚类)
导入库,读取数据,查看数据类型等进行分析,可视化数据 import matplotlib.pyplot as plt import numpy as np import scipy.io as sio#读取数据 path "./ex7data2.mat" data sio.loadmat(path) # print(type(data)) # print(data…...
lombok 驼峰命名缺陷,导致后台获取参数为null的解决办法
1.问题: 下面是我定义一个请求类的属性,采用Lombok注解,自动构建get和set方法。 Schema(description "父组织编码", requiredMode Schema.RequiredMode.REQUIRED) private String pOrgCode; 遇到这种命名,你会发现在…...
【dockerpython】亲测有效!适合新手!docker创建conda镜像+容器使用(挂载、端口映射、gpu使用)+云镜像仓库教程
文章目录 docker基本概念简介配置镜像加速源创建conda镜像1. 写 Dockerfile文件2. 创建镜像3. 创建容器并测试 容器的使用1. wsl挂载2. 端口映射3. 补充-gpu 云镜像仓库使用1. 登录2. 将本地镜像上传至云镜像仓库3. 从云镜像仓库下载镜像到本地 docker基本概念简介 简单来讲&a…...
矩阵,求矩阵秩、逆矩阵
求矩阵秩的方法: 高斯消元法:通过行变换将矩阵化为行阶梯形矩阵,然后数非零行的数量。LU分解:通过分解矩阵成上下三角矩阵,计算非零对角元素的数量。SVD分解:通过奇异值分解,计算非零奇异值的数…...
指针和const
const int* ptr,int* const ptr,const int* const ptr 这三种指针定义有什么区别?用法有什么不同? 指向的地址是否可变指向的地址上存储的内容是否可变const属性const int* ptr可改变不可改*ptr具有const属性int* const pts不可改…...
基于C#调用文心一言大模型制作桌面软件(可改装接口)
目录 开发前的准备账号注册应用创建应用接入 开始开发创建项目设计界面使用 AK,SK 生成鉴权签名窗体代码 百度智能云千帆大模型平台什么是百度智能云千帆大模型平台模型更新记录 开发前的准备 账号注册 访问百度智能云平台,通过百度账号登录或手机号验证…...
VScode插件安装
一、常用插件 Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code vscode 中文插件 Auto Rename Tag 闭合标签 Path Intellisense 一个非常实用的工具,它提供了文件路径的自动补全功能,可以极大地提高开发效率。路径自动补全、…...
《Milvus Cloud向量数据库指南》——高可用黄金标准:深入解析与业务策略考量
高可用黄金标准:深入解析与业务策略考量 在信息技术飞速发展的今天,高可用性(High Availability, HA)已成为衡量企业IT系统性能与稳定性的关键指标之一。它不仅仅关乎技术层面的优化与配置,更是企业保障业务连续性、提升客户体验、增强市场竞争力的重要基石。尽管高可用性…...
sqli-labs注入练习1,2关
sqli-labs第一关 判断是否存在sql注入 可见,根据输入数字的不同,结果也不同 判断sql语句是否是拼接,且是字符型还是数字型 由上可见,这关指定是字符型且存在sql注入漏洞 使用联合注入 第一步:首先知道表格有几列&…...
B站宋红康JAVA基础视频教程个人笔记chapter04
文章目录 1.IDEA安装好后的一些设置和学习1.1关于IDEA内部jdk版本的设置1.2 一些样式以及快捷键的常用设置(强烈推荐) 2.工程与模块管理3.如何彻底的卸载IDEA 1.IDEA安装好后的一些设置和学习 1.1关于IDEA内部jdk版本的设置 1.File—>Project Struc…...
关于java枚举为什么可以拿来当单例实现这件事看看ikun怎么说
为什么枚举可以保证单例 枚举可以保证单例的原因主要可以归结为以下几个方面: 1. 枚举的实例化过程 线程安全:枚举的实例化过程是由JVM控制的,在类加载时就完成了枚举常量的初始化。由于这个初始化过程是线程安全的(JVM在加载枚…...
Hugging Face下载模型
1、安装 huggingface-cli pip install -U huggingface_hub 2、设置环境变量(如果你打算使用 HF_ENDPOINT 环境变量来指定下载镜像站点): export HF_ENDPOINThttps://hf-mirror.com 3、使用 huggingface-cli 下载模型: 使用下面的命令来下…...
JVM-垃圾回收
什么是JVM的垃圾回收? 垃圾回收(Garbage Collection, GC)是Java虚拟机(JVM)自动管理内存的一种机制,其目的是自动回收不再使用的对象所占用的内存空间,以防止内存泄漏和提升内存利用效率。 运…...
8.C基础_指针基础
指针概述 1、定义与初始化 形式:<数据类型>* <变量名> <地址>; int a 10; int *p &a; 指针的类型不同,p时的偏移地址量不同,偏移地址 sizeof(类型)Byte 注意点: 指针的类型要与数据的类型保持一…...
安泰功率放大器使用注意事项有哪些内容和要求
功率放大器是一种广泛应用于音频系统、通信系统和实验室等领域的设备,其作用是将输入信号放大到足够大的功率输出。为了安全使用功率放大器并保证其性能和寿命,以下是一些使用功率放大器时需要注意的事项和要求。 一、选择适当的功率放大器: …...
windows下,使用vs code远程连接云服务器【以CentOS7为例】
windows下,使用vs code远程连接云服务器 1. 下载VS code并准备相关插件2. 使用Remote - SSH远程控制Linux 1. 下载VS code并准备相关插件 1. VS code官网: 下载地址:https://code.visualstudio.com/Download下载合适版本的vs code。 2. 推荐…...
x264 中像素扩边算法源码分析
介绍 在视频编码中,特别是在使用x264这样的H.264/MPEG-4 AVC编码器时,像素扩边(或称为边缘扩展)是一项重要的预处理步骤。像素扩边的目的是在帧的边缘添加额外的像素,这样在编码过程中可以应用滤波器,如去块滤波器(deblocking filter)和水平/垂直滤波器,而不会受到帧…...
数据结构——双链表详解(超详细)
前言: 小编在之前已经写过单链表的创建了,接下来要开始双链表的讲解了,双链表比单链表要复杂一些,不过确实要比单链表更好进行实现!下面紧跟小编的步伐,开启今天的双链表之旅! 目录 1.概念和结构…...
银行项目利润问题(贪心思想)
import java.util.Comparator; import java.util.PriorityQueue;public class test32 {//输入正数数组costs、正数数组profits、正数K、正数M//costs[i]表示i号项目花费,profits[i]表示i号项目在扣除花费后还挣的钱//K表示有多少项目//M表示初始资金//每做完一个项目…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
