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

从 XMLHttpRequest 到 Fetch:现代 Web 请求技术的演进

在现代 Web 开发中,与服务器进行数据交互是必不可少的一部分。无论是加载动态内容、提交表单数据,还是实现实时更新,都需要通过 HTTP 请求来完成。本文将介绍两种主流的 Web 请求技术:XMLHttpRequest 和 Fetch API,探讨它们的优缺点、使用场景以及如何选择合适的技术。

1. XMLHttpRequest:Web 请求的基石

什么是 XMLHttpRequest?

XMLHttpRequest 是一个 JavaScript 对象,用于在浏览器和服务器之间发送 HTTP 请求。它是实现 AJAX(Asynchronous JavaScript and XML)的核心技术,允许网页在不重新加载的情况下与服务器交换数据。

核心特点

  • 异步通信:可以在后台发送请求,不会阻塞页面渲染。

  • 支持多种数据格式:虽然名字中包含 XML,但它可以处理 JSON、HTML、纯文本等多种数据格式。

  • 跨域请求:通过 CORS(跨域资源共享)支持跨域请求。

基本用法

以下是 XMLHttpRequest 的基本使用步骤:

创建对象

const xhr = new XMLHttpRequest();

配置请求

  • 使用 open() 方法设置请求类型(GET、POST 等)和目标 URL。

  • 例如:

    xhr.open('GET', 'https://api.example.com/data', true);

设置回调函数

  • 监听 onreadystatechange 事件,处理服务器响应。

  • 例如:

    xhr.onreadystatechange = function() {if (xhr.readyState === 4 && xhr.status === 200) {console.log(xhr.responseText);}
    };

发送请求

  • 使用 send() 方法发送请求。

  • 例如:

    xhr.send();

处理响应

  • 通过 responseText 或 responseXML 获取服务器返回的数据。

 完整的示例:

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

优缺点

  • 优点

    • 兼容性好,几乎支持所有浏览器。

    • 功能强大,支持多种数据格式和跨域请求。

  • 缺点

    • 语法复杂,回调函数嵌套容易导致“回调地狱”。

    • 错误处理不够直观。

2. Fetch API:现代 Web 请求的新标准

什么是 Fetch?

Fetch 是现代浏览器提供的一个用于发起网络请求的 API,旨在替代 XMLHttpRequest。它基于 Promise,提供了更简洁、灵活的语法,并支持流式数据处理。

核心特点

  • 基于 Promise:使用 Promise 处理异步操作,代码更易读。

  • 简洁的语法:相比 XMLHttpRequestFetch 的代码更简洁直观。

  • 流式数据处理:支持处理大文件或流式数据。

  • 内置 CORS 支持:默认支持跨域请求。

基本用法

以下是 Fetch 的基本使用示例:

发起 GET 请求

fetch('https://api.example.com/data').then(response => response.json()) // 将响应解析为 JSON.then(data => console.log(data))   // 处理数据.catch(error => console.error(error)); // 捕获错误

 发起 POST 请求

fetch('https://api.example.com/data', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ key: 'value' }) // 发送 JSON 数据
}).then(response => response.json()).then(data => console.log(data)).catch(error => console.error(error));

处理响应

  • response.json():解析为 JSON。

  • response.text():解析为文本。

  • response.blob():解析为二进制数据(如图片、文件)。

  • response.arrayBuffer():解析为二进制数组。

错误处理

  • Fetch 只有在网络错误时才会触发 catch,HTTP 错误(如 404、500)需要通过 response.ok 或 response.status 手动检查。

  • 例如:

    fetch(url).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));

高级用法

设置请求头

fetch(url, {headers: {'Authorization': 'Bearer token','Content-Type': 'application/json'}
});

 超时控制Fetch 本身不支持超时设置,但可以通过 Promise.race 实现

const timeout = new Promise((resolve, reject) => {setTimeout(() => reject(new Error('Request timed out')), 5000);
});Promise.race([fetch(url), timeout]).then(response => response.json()).then(data => console.log(data)).catch(error => console.error(error));

取消请求:使用 AbortController 取消请求

const controller = new AbortController();
const signal = controller.signal;fetch(url, { signal }).then(response => response.json()).then(data => console.log(data)).catch(error => console.error(error));// 取消请求
controller.abort();

优缺点

  • 优点

    • 语法简洁,基于 Promise,易于使用。

    • 支持流式数据处理和更强大的功能。

  • 缺点

    • 需要手动检查 HTTP 错误。

    • 兼容性较差(不支持 IE 浏览器)。

3. XMLHttpRequest vs Fetch:如何选择?

特性XMLHttpRequestFetch
语法基于回调,较复杂基于 Promise,更简洁
错误处理自动处理 HTTP 错误需要手动检查 HTTP 错误
流式数据处理不支持支持
取消请求使用 xhr.abort()使用 AbortController
兼容性所有浏览器支持现代浏览器支持

选择建议

  • 使用 Fetch

    • 如果你的项目面向现代浏览器,推荐使用 Fetch,因为它更简洁、功能更强大。

    • 如果需要处理流式数据或实现更复杂的请求逻辑,Fetch 是更好的选择。

  • 使用 XMLHttpRequest

    • 如果需要兼容旧浏览器(如 IE),XMLHttpRequest 是唯一的选择。

    • 如果你对 Fetch 的错误处理机制不满意,也可以选择 XMLHttpRequest

4. 总结

从 XMLHttpRequest 到 Fetch,Web 请求技术经历了显著的演进。XMLHttpRequest 作为 AJAX 的基石,为现代 Web 应用奠定了基础;而 Fetch 则以其简洁的语法和强大的功能,成为现代开发的首选工具。

在实际开发中,选择哪种技术取决于项目需求和目标用户。如果你需要兼容旧浏览器,XMLHttpRequest 是可靠的选择;如果你追求更现代的开发体验,Fetch 无疑是更好的工具。无论选择哪种技术,理解它们的原理和使用场景,都是成为一名优秀开发者的关键。

相关文章:

从 XMLHttpRequest 到 Fetch:现代 Web 请求技术的演进

在现代 Web 开发中,与服务器进行数据交互是必不可少的一部分。无论是加载动态内容、提交表单数据,还是实现实时更新,都需要通过 HTTP 请求来完成。本文将介绍两种主流的 Web 请求技术:XMLHttpRequest 和 Fetch API,探讨…...

Linux纯命令行界面下SVN的简单使用教程

诸神缄默不语-个人技术博文与视频目录 我用的VSCode插件是这个: 可以在文件中用色块显示代码修改了什么地方,点击色块还可以显示修改内容。 文章目录 1. SVN安装2. checkout3. update1. 将文件加入版本控制 4. commit5. 查看SVN信息:info6.…...

python 初学攻略(上)

废话写在前面,后面都是干货,这个语言教学到处都是。我这里直接给你搞定所有要用的就好了。 环境安装(略) 输出函数print 转义字符 二进制与字符编码 标识符和保留字 变量的定义和使用 数据类型 整数类型 浮点类型 布尔类型 字符串…...

大语言模型 智能助手——既能生成自然语言回复,又能在必要时调用外部工具获取实时数据

示例代码: import json from langgraph.graph import Graph, END,StateGraph from langchain_core.utils.function_calling import convert_to_openai_function from langchain_community.tools.openweathermap import OpenWeatherMapQueryRun from langchain_core…...

人工智能开发面经AI、大数据、算法

以下是一份AI算法开发岗位的面试面经,结合最新行业趋势和经典问题,涵盖技术解析与实战案例,供参考: 一、机器学习基础(占比约30%) 1. 过拟合与欠拟合的解决方案 问题:如何解决模型过拟合&…...

计算机网络——子网掩码

一、子网掩码是什么?它长什么样? 子网掩码的定义 子网掩码是一个32位的二进制数字,与IP地址“配对使用”,用于标识IP地址中哪部分属于网络地址,哪部分属于主机地址。 示例:IP地址 192.168.1.10,…...

《基于大数据的相州镇新农村商务数据分析与研究》开题报告

目录 一、选题依据 1.选题背景 2.国内外研究现状与水平 (1)国外研究现状 (2)国内研究现状 3.发展趋势 4.研究意义 二、研究内容 1.学术构思与思路 (1)主要研究内容 (2)拟解决的关键问…...

Linux : 环境变量

目录 一 环境变量 1.基本概念 二 常见环境变量 三 查看环境变量的方法 1.env:查看系统中所有环境变量 2. echo $NAME 四 如何不带路径也能运行的自己的程序 1.将自己的程序直接添加到PATH指定的路径下 五 环境变量与本地变量 1.本地变量 2. 环境变量 六C、C中main()…...

SQL-labs13-16闯关记录

http://127.0.0.1/sqli-labs/less-13/ 基于POST单引号双注入变形 1,依然是一个登录框,POST型SQL注入 2,挂上burpsuite,然后抓取请求,构造请求判断漏洞类型和闭合条件 admin 发生了报错,根据提示闭合方式是(…...

2025-03-04 学习记录--C/C++-PTA 习题5-4 使用函数求素数和

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 二、代码&#xff08;C语言&#xff09;⭐️ #include <stdio.h>// 函数声明&#xff1a;判断一个数是…...

Mybatis-Plus 插件机制与自定义插件实现

1. Mybatis-Plus 插件系统概述 Mybatis-Plus 提供了一个简单而强大的插件机制&#xff0c;允许开发者在 MyBatis 执行 SQL 的过程中插入自定义逻辑。通过插件机制&#xff0c;用户可以实现对 SQL 执行过程的拦截和修改。Mybatis-Plus 插件基于 MyBatis 的拦截器模式进行实现&a…...

Virtuose 6D TAO HF力反馈系统:加强力遥操作主手

Virtuose 6D TAO是一款搭载六主动自由度的力反馈设备&#xff0c;该产品自带被动式夹持器&#xff0c;工作空间大&#xff0c;可与EtherCAT接口通信&#xff0c;是轻松控制从机械臂的首选产品&#xff0c;特别适合工业遥操作、核工业遥操作等应用。 产品特点 ▪ 六主动自由度、…...

使用AI后为什么思考会变得困难?

使用AI后为什么思考会变得困难&#xff1f; 我总结了四篇近期的研究论文&#xff0c;来展示AI是如何以及为什么侵蚀我们的批判性思维能力。 作者使用AI制作的图像 前言&#xff1a;作者在这篇文章中&#xff0c;借AI技术的崛起&#xff0c;揭示了一场悄然发生的思想博弈。表面…...

【Resis实战分析】Redis问题导致页面timeout知识点分析

事故现象&#xff1a;前端页面返回timeout 事故回溯总结一句话&#xff1a; &#xff08;1&#xff09;因为大KEY调用量&#xff0c;随着白天自然流量趋势增长而增长&#xff0c;最终在业务高峰最高点期占满带宽使用100%。 &#xfeff; &#xfeff; &#xff08;2&#x…...

【金融量化】Ptrade中交易环境支持的业务类型

1. 普通股票买卖 • 特点&#xff1a; 普通股票买卖是最基础的交易形式&#xff0c;投资者通过买入和卖出上市公司的股票来获取收益。 ◦ 流动性高&#xff1a;股票市场交易活跃&#xff0c;买卖方便。 ◦ 收益来源多样&#xff1a;包括股价上涨的资本利得和公司分红。 ◦ 风险…...

FlashMLA(DeepSeek开源周,第一个框架):含源码分析

1. 概述 FlashMLA 是由 DeepSeek 原创开发的一种深度学习框架&#xff0c;专门用于加速多头注意力机制&#xff08;MLA&#xff09;架构的推理过程。它通过优化内存管理和计算效率&#xff0c;显著提升了模型在高性能 GPU 上的推理速度。FlashMLA 主要适用于 DeepSeek 的架构模…...

点大商城V2-2.6.6.1全能版源码+最新排队免单插件功能

一.介绍 点大商城V2独立开源版本&#xff0c;版本更新至2.6.6&#xff0c;系统支持多端&#xff0c;前端为UNiapp&#xff0c;多端编译。 二.安装环境&#xff1a; Nginx 1.22PHP7.3MySQL 5.7 推荐PHP 7.3&#xff08;不得大于此版本&#xff0c;否则容易出bug&#xff09; …...

行为模式---命令模式

概念 命令模式是一种行为设计模式&#xff0c;它的核心思想就是将请求封装为一个对象&#xff0c;此对象包含与请求相关的所有信息。可以用不同的请求对客户进行参数化。命令模式通过将请求的发送者和接收者解耦&#xff0c;支持请求的排队、记录、撤销等操作。 使用场景 1、…...

Graph RAG 迎来记忆革命:“海马体”机制让问答更精准!

随着生成式 AI 技术的快速发展,RAG(Retrieval-Augmented Generation)和 Agent 成为企业应用大模型的最直接途径。然而,传统的 RAG 系统在准确性和动态学习能力上存在明显不足,尤其是在处理复杂上下文和关联性任务时表现不佳。近期,一篇论文提出了 HippoRAG 2,这一新型 R…...

Linux——基本指令

我们今天学习Linux最基础的指令 ls 指令 语法&#xff1a; ls [选项] [⽬录或⽂件] 功能&#xff1a;对于⽬录&#xff0c;该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件&#xff0c;将列出⽂件名以及其他信 息。 命令中的选项&#xff0c;一次可以传递多个 &#xff0c…...

【C++】模板编程入门指南:零基础掌握泛型编程核心(初阶)

文章目录 一、泛型编程二、函数模板1. 函数模板的概念和格式2. 函数模板的原理3. 函数模板的实例化隐式实例化显式实例化 三、类模板 一、泛型编程 泛型编程就是编写与类型无关的通用代码&#xff0c;是代码复用的一种手段&#xff0c;模板是泛型编程的基础&#xff0c;可能不太…...

React实现lottie文件预览(可识别json文件或压缩包带资源的素材)

React实现lottie文件预览&#xff08;可识别json文件或压缩包带资源的素材&#xff09; &#x1f534; 1、React实现lottie文件预览&#xff0c;所用到的第三方库 &#x1f7e2; 1.1、 react-lottie jszip-syncnpm install react-lottie jszip-sync // 或者yarn add react-…...

网上打印平台哪个好用?网上打印资料推荐

网上打印平台哪个好用 随着数字化办公的普及&#xff0c;网上打印平台因其便捷性和经济性而受到越来越多人的青睐。无论是学生、上班族还是个人用户&#xff0c;在需要快速打印资料时&#xff0c;一个好用的在线打印服务可以大大节省时间和成本。 那么&#xff0c;如何选择一…...

Mac远程桌面软件哪个好用?

远程桌面软件能帮助我们快速的远程控制另一台电脑&#xff0c;从而提供远程帮助&#xff0c;或者进行远程办公。那么&#xff0c;对macOS系统有什么好用的Mac远程桌面软件呢&#xff1f; 远程看看是一款操作简单、界面简洁的远程桌面软件&#xff0c;支持跨平台操作&#xff0…...

【回溯 力扣】17. 电话号码的字母组合

题目 17. 电话号码的字母组合 思路 定义数组存储数字对应的字符串&#xff0c;本题回溯时为index1,因为下一个数字选的是下一个字符串&#xff0c;前两题都是属于同一个字符串。 代码 class Solution { private:vector<string>result;string duiying[10]{"&quo…...

【基础1】冒泡排序

核心思想 冒泡排序是通过相邻元素的连续比较和交换&#xff0c;使得较大的元素逐渐"浮"到数组的末尾&#xff0c;如同水中气泡上浮的过程 特点&#xff1a; 每轮遍历将最大的未排序元素移动到正确位置​稳定排序&#xff1a;相等元素的相对位置保持不变​原地排序…...

C#—Settings配置详解

C#—Settings配置详解 在C#项目中&#xff0c;全局配置通常指的是应用程序的设置&#xff08;settings&#xff09;&#xff0c;这些设置可以跨多个类或组件使用&#xff0c;并且通常用于存储应用程序的配置信息&#xff0c;如数据库连接字符串、用户偏好设置等。 Settings配置…...

详解DeepSeek模型底层原理及和ChatGPT区别点

一、DeepSeek大模型原理 架构基础 DeepSeek基于Transformer架构,Transformer架构主要由编码器和解码器组成,在自然语言处理任务中,通常使用的是Transformer的解码器部分。它的核心是自注意力机制(Self - Attention),这个机制允许模型在处理输入序列时,关注序列中不同位…...

PyCharm中通过命令行执行`pip`命令下载到哪里了:虚拟环境目录下

PyCharm中通过命令行执行pip命令下载到哪里了:虚拟环境目录下 在PyCharm中通过命令行执行pip命令安装工具包,包的下载位置取决于多种因素 虚拟环境 如果项目使用了虚拟环境(通常是推荐的做法): Windows:虚拟环境通常位于项目目录下的.venv文件夹(默认情况)或你指定…...

Golang的性能分析指标解读

Golang的性能分析指标解读 一、概述 语言&#xff09;是一种由Google开发的开源编程语言&#xff0c;以其并发性能和高效的编译速度而闻名。对于程序员来说&#xff0c;了解如何对Golang应用程序进行性能分析是非常重要的&#xff0c;因为这能帮助他们发现潜在的性能瓶颈并对其…...