AJAX和XHR、fetch、axios的关系

AJAX中有两套原生的API,一个是XHR(XMLHttpRequest),一个是Fetch API

axios是第三方库,在浏览器环境中使用的是XHR

umi-request也是第三方库,在浏览器环境中使用的是Fetch

在 AJAX(Asynchronous JavaScript and XML)中,原生的 API 主要有两种:XMLHttpRequest(简称 XHR)和Fetch API。这两者都用于在客户端与服务器之间进行异步通信,但它们有一些关键的区别,尤其是在使用方式、功能和灵活性上。以下是两者的详细比较和作用。

1.XMLHttpRequest(XHR)

XMLHttpRequest 是最早用于在浏览器中执行异步 HTTP 请求的 API,通常用于实现 AJAX 请求。它自 1999 年起就已被引入,长期以来是进行异步请求的标准方法。

主要特点:

  • 语法复杂:使用起来相对较复杂,需要更多的配置和回调函数来处理请求的各个阶段(如发送请求、接收响应等)。

  • 回调函数:它使用回调函数来处理异步响应,需要监听onreadystatechange 事件,或使用onload、onerror 等事件处理程序来处理响应。

  • 支持的请求类型:XMLHttpRequest 支持多种 HTTP 请求方法(如GET、POST、PUT、DELETE 等)。

  • 支持同步和异步请求:可以选择同步(阻塞)或异步(非阻塞)请求,但同步请求会导致浏览器冻结,影响用户体验,因此通常不推荐使用同步请求。

  • 支持跨域请求:通过XMLHttpRequest 进行跨域请求时,需要使用 CORS(跨域资源共享)机制。

    const xhr = new XMLHttpRequest();
    xhr.open("GET", "https://api.example.com/data", true); // true表示异步请求

    xhr.onreadystatechange = function () {
    if (xhr.readyState === XMLHttpRequest.DONE) {
    if (xhr.status === 200) {
    console.log("Response:", xhr.responseText); // 处理响应数据
    } else {
    console.error("Request failed with status:", xhr.status);
    }
    }
    };

    xhr.send(); // 发送请求

优缺点:

  • 优点:

  • 支持所有主流浏览器。

  • 可以处理复杂的请求场景。

  • 缺点:

  • 使用起来较为复杂,需要手动管理事件和回调。

  • 不支持 Promise,需要额外处理异步操作。


2.Fetch API

Fetch API 是现代浏览器中新加入的用于发起网络请求的 API,相比XMLHttpRequest,Fetch 提供了更简洁、更强大的语法,并且它基于 Promise,支持更直观的异步操作。

主要特点:

  • 基于 Promise:Fetch API 基于 Promise,这使得异步操作更加简洁和灵活。可以通过then() 和catch() 方法处理请求结果和错误。

  • 默认异步:Fetch 请求默认是异步的,因此不会阻塞线程,也没有必要手动设置异步标志。

  • 不支持同步请求:与XMLHttpRequest 不同,Fetch 不支持同步请求,始终是异步的。

  • 响应处理:Fetch 返回的响应对象提供了更丰富的方法来处理响应数据,例如可以方便地将响应解析为 JSON、文本、二进制数据等。

  • 支持 CORS:Fetch 与XMLHttpRequest 一样,支持跨域请求,但其跨域配置更加简洁。

示例代码:

fetch("https://api.example.com/data")
  .then(response => {
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    return response.json(); // 解析为 JSON
  })
  .then(data => {
    console.log("Response data:", data); // 处理数据
  })
  .catch(error => {
    console.error("There was a problem with the fetch operation:", error);
  });

优缺点:

  • 优点:

  • 基于 Promise,代码更加简洁、易于理解和维护。

  • 更好地支持现代 JavaScript 的异步操作(如 async/await)。

  • 对于响应处理(如 JSON 解析)更加方便和灵活。

  • 缺点:

  • 不支持较旧的浏览器(如 IE)。不过可以通过 polyfill 进行兼容。

  • 需要手动处理 HTTP 错误(fetch 仅在网络失败时抛出错误,HTTP 错误状态(如 404、500)不会抛出异常)。


  1. 关键区别

|------------|------------------------------------------|-----------------------------------|
| 特性 | XMLHttpRequest | Fetch API |
| API 风格 | 基于事件回调和状态变化 | 基于 Promise,支持 thencatch 语法 |
| 默认异步 | 支持同步和异步(不推荐使用同步) | 始终为异步 |
| 响应处理 | 使用 xhr.responseText,需要手动解析数据 | 支持直接解析为 JSON、文本、二进制等 |
| 支持的功能 | 需要手动设置跨域(CORS)、状态检查等 | 自动处理跨域,默认遵循 CORS 标准 |
| 错误处理 | 需要监听 onerroronreadystatechange 事件 | 只会在网络错误时抛出异常,需要手动处理 HTTP 错误 |
| 支持的浏览器 | 广泛支持(包括较旧的浏览器) | 主要支持现代浏览器,需要 polyfill 来兼容旧版浏览器 |
| 同步请求 | 支持(但不推荐) | 不支持同步请求 |

功能点:

  1. 总结

-XMLHttpRequest 是传统的 API,适合处理兼容性要求较高的项目,但使用起来较为繁琐,特别是处理回调和异步操作时。

-Fetch API 是现代的、基于 Promise 的 API,提供了更简洁的语法,易于使用,尤其是与async/await 结合使用时,代码更加清晰和可维护。不过,它不支持同步请求,并且需要现代浏览器支持。

因此,现代 Web 开发中,Fetch API 更为推荐,特别是当你的目标浏览器支持它时。如果需要兼容老旧浏览器,可能仍然需要使用XMLHttpRequest 或结合使用 polyfill 来实现。

相关推荐
m0_748238789 分钟前
前端文件预览整合(一)
前端·状态模式
程序员大金21 分钟前
基于SpringBoot+Vue的高校电动车租赁系统
前端·javascript·vue.js·spring boot·mysql·intellij-idea·旅游
莫惊春29 分钟前
HTML5 第七章
前端·html·html5
莫惊春35 分钟前
HTML5 第六章
前端·html·html5
m0_748256561 小时前
前端新手教程:HTML、CSS 和 JavaScript 全面详解及实用案例
前端·css·html
幽兰的天空1 小时前
HTML 基本语法
前端·html
亦世凡华、2 小时前
从模型到视图:如何用 .NET Core MVC 构建完整 Web 应用
前端·经验分享·c#·mvc·.netcore
恋猫de小郭2 小时前
Flutter Web 正式移除 HTML renderer,只支持 CanvasKit 和 SkWasm
前端·flutter·html
CoderLiu3 小时前
用Rust写了一个GitLib代码分析工具
前端·git·rust
杨荧3 小时前
【开源免费】基于Vue和SpringBoot的图书进销存管理系统(附论文)
前端·javascript·vue.js·spring boot·spring cloud·java-ee·开源