你知道 XHR 和 Fetch 的区别吗?

你知道 XHR 和 Fetch 的区别吗?

现如今,网站开发普遍采用前后端分离的模式,数据交互成为了不可或缺的关键环节。在这个过程中,XHRFetch API 是两种最常见的方法,用于从 Web 服务器获取数据。XHR 是一种传统的数据请求方式,而 Fetch API 则代表了现代 Web 开发的新兴标准。接下来,我们将一同深入学习它们的使用方法和适用场景。

XMLHttpRequest

XMLHttpRequest ,通常简称为 XHR。通过 XMLHttpRequest可以在不刷新页面的情况下请求特定 URL,获取数据。XMLHttpRequest 在 AJAX 编程中(比如 jquery)被大量使用。

AJAX :异步 JavaScript 和 XML。许多人容易把它和jqajax 混淆。它是一个技术统称,本身不是一种技术。

特点

  1. 异步请求XHR 允许进行异步请求,它可以在后台执行,而不会阻止页面的其他操作。
  2. 支持跨域请求:通过服务器端设置允许跨域请求,从不同域的服务器获取数据。
  3. 事件驱动 :提供了 onloadonerroronprogress 等一系列事件来监听请求的状态变化。
  4. 灵活性:提供了对请求头、响应头以及请求方法的完全控制,使其非常灵活。

工作原理

XHR 的工作原理主要为:

  1. 创建 XHR 对象实例:通过new XMLHttpRequest()创建一个XHR 对象。
  2. 配置请求:使用open()方法设置请求方法(GET、POST 等)、URL,以及是否要异步执行请求。
  3. 设置回调函数:设置事件处理程序来处理请求完成、成功、失败等不同的状态。
  4. 发起请求:使用send()方法发送请求。
  5. 处理响应:在事件处理程序中处理响应数据,通常使用responseTextresponseXML来访问响应内容。
javascript 复制代码
 // 创建一个新的XHR对象
 const xhr = new XMLHttpRequest();
 ​
 // 配置请求
 xhr.open("GET", "https://api.baidu.com/test", true);
 ​
 // 设置响应处理函数
 xhr.onload = function() {
   if (xhr.status === 200) {
     // 请求成功
     const responseData = xhr.responseText;
     console.log("成功获取数据:", responseData);
   } else {
     // 请求失败
     console.error("请求失败,状态码:" + xhr.status);
   }
 };
 ​
 // 发起请求
 xhr.send();

XHR的响应处理通常在onreadystatechange事件处理程序中完成。在上面的例子中,我们等待 XHR 对象的状态变为 4(表示请求完成)并且 HTTP 状态码为 200(表示成功响应)时,解析响应数据。

Fetch API

Fetch 是一种现代的数据网络请求 API,它旨在解决XHR 的一些问题,提供了更强大、更灵活的方式来处理 HTTP 请求。可以理解为 XMLHttpRequest的升级版。

特点

  1. Promise 风格 :Fetch API 使用 Promise 对象来处理异步请求,使代码更具可读性和可维护性。
  2. 更简单的语法 :相较于 XHR,Fetch API 的语法更加简单明了,通常只需要几行代码来完成请求。
  3. 默认不接受跨域请求 :为了安全性,Fetch API 默认不接受跨域请求,但可以通过 CORS(跨域资源共享)来进行配置。
  4. 更现代的架构 :Fetch API 是建立在 PromiseStream 之上的,支持更灵活的数据处理和流式传输。

工作原理

Fetch 的工作原理主要为:

  1. 使用fetch()函数创建请求:传入要请求的 URL,以及可选的配置参数,例如请求方法、请求头等。
  2. 处理响应:fetch()返回一个 Promise,您可以使用.then()链式调用来处理响应数据,例如使用.json()方法解析 JSON 数据或.text()方法获取文本数据。
  3. 错误处理:您可以使用.catch()方法来捕获任何请求或响应的错误。
  4. 使用async/await:如果需要,您还可以使用async/await来更清晰地处理异步操作。

Fetch API 的特性和简单的语法使它在许多前端项目中成为首选工具。然而,它也有一些限制,例如不支持同步请求,因此需要谨慎使用。

javascript 复制代码
 fetch("https://api.baidu.com/test")
   .then(response => {
     if (!response.ok) {
       throw new Error("请求失败,状态码:" + response.status);
     }
     return response.json();
   })
   .then(data => {
     // 请求成功,处理响应数据
     console.log("成功获取数据:", data);
   })
   .catch(error => {
     // 请求失败,处理错误
     console.error(error);
   });

XHR 和 Fetch 的对比

XHR和 Fetch 都用于进行 HTTP 请求,但它们之间存在一些关键区别:

  • 语法: Fetch 使用 Promise,更直观和易于理解。
  • 跨域请求: Fetch 在跨域请求方面更灵活,支持CORS
  • 流式传输: Fetch 支持可读流,适用于大文件下载。
  • 维护性: Fetch 更容易维护和扩展。

基于XHR 封装的库

  • jquery:一个 JavaScript 库,提供了用于处理 DOM 操作、事件处理和 XHR 请求的便捷方法。

  • axios:一个流行的 HTTP 请求库,基于 XHR 开发,支持浏览器和 Node.js。实际上,axios可以用在浏览器和 node.js 中是因为,它会自动判断当前环境是什么,如果是浏览器,就会基于**XMLHttpRequests实现axios。如果是node.js环境,就会 基于node内置核心模块http**实现axios

    • axios的基本原理

      • axios还是属于 XMLHttpRequest, 因此需要实现一个ajax。或者基于http
      • 还需要一个promise对象来对结果进行处理。只需要将结果通过promise进行封装一下就可以了

基于 fetch 封装的库

  • redaxios:它具有与 axios 类似的 API,但更轻量级且适用于现代 Web 开发。
  • umi-request:由 Umi框架维护的网络请求库,提供了强大的拦截器、中间件和数据转换功能。

XMLHttpRequest (XHR) 和 Fetch API 都是前端开发中用于进行数据请求的有力工具。XHR 在传统项目中仍然有用,而 Fetch API 则在现代 Web 开发中越来越流行。具体选择哪个工具取决于项目的需求和开发团队的偏好,希望本文对你有帮助!

参考文章:

相关推荐
PinTrust SSL证书1 天前
Sectigo(Comodo)域名型DV通配符SSL
网络·网络协议·http·网络安全·https·软件工程·ssl
DevilSeagull1 天前
MySQL(1) 安装与配置
java·数据库·git·mysql·http·开源·github
2501_913061341 天前
网络原理之HTTP(3)
java·网络·网络协议·http·面试
pengyi8710151 天前
代理IP在爬虫中的核心应用,高匿代理避检测基础
大数据·网络·网络协议·tcp/ip·http
code_li2 天前
HTTPS免费证书配置指南
网络协议·http·https
tie12342 天前
HTTP相关
网络·网络协议·http
埃伊蟹黄面2 天前
应用层HTTP协议
linux·网络·网络协议·http
Lentou2 天前
程序调用AI大模型方式(SDK\HTTP\SPRINGAI\LANFCHAIN4J)
人工智能·网络协议·http
甘露寺2 天前
HTTP长连接内容详解
网络·网络协议·http
acaad2 天前
java访问https连接报错 unable to find valid certification path to requested target
网络协议·http·https