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 来实现。

相关推荐
ayqy贾杰9 分钟前
基层管理的三板斧,在AI时代行不通了
前端·后端·团队管理
Apifox10 分钟前
Apifox 5 月更新|Postman 导入优化、Runner 支持非 root 运行、请求代码自动带鉴权
前端·后端·安全
miaowmiaow21 分钟前
PSD2Code 近期更新与深度解析:从设计稿到生产级代码的完整技术栈
前端·人工智能·ai编程
Hilaku32 分钟前
多标签页并发请求导致 Token 刷新失败?只有 15行代码就能解决 !
前端·javascript·程序员
Nile40 分钟前
解密Palantir系列一:4. Ontology 不是哲学
开发语言·前端·javascript
因_崔斯汀1 小时前
ECharts 区域地图可视化实战:以山东地图为例
前端
Bacon1 小时前
手摸手带你搞清楚 AI Agent 的六大核心概念
前端·人工智能
王林不想说话1 小时前
TypeScript 进阶知识总结:从 extends、泛型到 infer,一篇打通 TS 类型系统
前端·javascript·typescript
罗超驿1 小时前
15.JavaScript 函数与作用域完全指南:语法、参数、表达式与作用域链实战
开发语言·前端·javascript
.千余1 小时前
【C++】C++类与对象2:C++构造函数、运算符重载与流输入输出全面解析
c语言·开发语言·前端·c++·经验分享