xhr、ajax、axois、fetch的区别

2024-09-04 23:36
文章标签 区别 ajax fetch xhr axois

本文主要是介绍xhr、ajax、axois、fetch的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、XMLHttpRequest (XHR)、AJAX、Axios 和 Fetch API 都是用于在不重新加载整个页面的情况下与服务器进行通信的技术和库。它们在处理超时、终止请求、进度反馈等机制上有一些显著的差异。以下是它们的详细比较:

1. XMLHttpRequest (XHR)

XMLHttpRequest 是一种浏览器内置的对象,用于与服务器进行交互。它可以发送和接收各种格式的数据,包括 JSON、XML、HTML 和纯文本。

特点

  • 原生 JavaScript 对象,无需额外引入库。
  • 支持同步和异步请求。
  • 语法较为复杂,需要手动处理回调和状态变化。
  • 支持超时设置、终止请求和进度事件。

示例

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);// 设置超时
xhr.timeout = 5000; // 5秒// 处理超时
xhr.ontimeout = function () {console.error('Request timed out');
};// 处理进度事件
xhr.onprogress = function (event) {if (event.lengthComputable) {const percentComplete = (event.loaded / event.total) * 100;console.log(`Progress: ${percentComplete}%`);}
};// 处理请求完成
xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {console.log(JSON.parse(xhr.responseText));}
};// 终止请求
const abortButton = document.getElementById('abortButton');
abortButton.addEventListener('click', function () {xhr.abort();console.log('Request aborted');
});xhr.send();

2. AJAX (使用 jQuery)

AJAX(Asynchronous JavaScript and XML)是一种使用多种技术(包括 XMLHttpRequest)来创建异步 Web 应用程序的方法。它允许网页在后台与服务器进行通信,从而实现动态更新页面内容,而无需重新加载整个页面。

特点

  • 通常使用 XMLHttpRequest 或 Fetch API 实现。
  • 可以与各种 JavaScript 库(如 jQuery)结合使用,简化请求处理。
  • jQuery 的 ajax 方法支持超时设置、终止请求和进度事件。

示例(使用 jQuery)

const xhr = $.ajax({url: 'https://api.example.com/data',method: 'GET',timeout: 5000, // 5秒xhr: function () {const xhr = new window.XMLHttpRequest();// 处理进度事件xhr.onprogress = function (event) {if (event.lengthComputable) {const percentComplete = (event.loaded / event.total) * 100;console.log(`Progress: ${percentComplete}%`);}};return xhr;},success: function (data) {console.log(data);},error: function (error) {if (error.statusText === 'timeout') {console.error('Request timed out');} else {console.error(error);}}
});// 终止请求
const abortButton = document.getElementById('abortButton');
abortButton.addEventListener('click', function () {xhr.abort();console.log('Request aborted');
});

3. Axios

Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js。它提供了更简洁的 API 和更强大的功能,简化了 HTTP 请求的处理。

特点

  • 基于 Promise,支持异步操作。
  • 支持请求和响应拦截器。
  • 自动转换 JSON 数据。
  • 支持取消请求。
  • 更简洁的语法和更好的错误处理。
  • 支持超时设置和进度事件(通过配置选项)。

示例

const CancelToken = axios.CancelToken;
let cancel;// 发送请求
axios.get('https://api.example.com/data', {cancelToken: new CancelToken(function executor(c) {cancel = c;}),timeout: 5000, // 5秒onDownloadProgress: function (progressEvent) {if (progressEvent.lengthComputable) {const percentComplete = (progressEvent.loaded / progressEvent.total) * 100;console.log(`Progress: ${percentComplete}%`);}}
})
.then(response => {console.log(response.data);
})
.catch(error => {if (axios.isCancel(error)) {console.log('Request canceled', error.message);} else if (error.code === 'ECONNABORTED') {console.error('Request timed out');} else {console.error('Fetch error:', error);}
});// 终止请求
const abortButton = document.getElementById('abortButton');
abortButton.addEventListener('click', function () {cancel('Request canceled by the user.');
});

4. Fetch API

Fetch API 是一种现代的、基于 Promise 的方式来进行网络请求。它提供了更简洁的 API 和更强大的功能,简化了 HTTP 请求的处理。

特点

  • 基于 Promise,支持异步操作。
  • 语法更简洁,易于阅读和维护。
  • 默认不发送 cookies,需要手动配置。
  • 更好的错误处理机制。
  • 支持流式处理响应。
  • 现代浏览器支持较好,但在一些旧浏览器中需要使用 polyfill。
  • 不直接支持超时和进度事件,需要手动实现。

示例

const controller = new AbortController();
const signal = controller.signal;fetch('https://api.example.com/data', { signal }).then(response => {if (!response.ok) {throw new Error('Network response was not ok');}return response.json();}).then(data => console.log(data)).catch(error => {if (error.name === 'AbortError') {console.log('Fetch aborted');} else {console.error('Fetch error:', error);}});// 终止请求
const abortButton = document.getElementById('abortButton');
abortButton.addEventListener('click', function () {controller.abort();
});

二、比较

特性XMLHttpRequest (XHR)AJAX (使用 jQuery)AxiosFetch API
基于原生 JavaScriptXMLHttpRequestPromisePromise
语法简洁性较复杂较简洁非常简洁非常简洁
异步支持
JSON 自动转换
请求/响应拦截器否(需要手动实现)
取消请求是(通过 AbortController)
进度事件是(通过配置选项)否(需要手动实现)
超时机制否(需要手动实现)
浏览器兼容性所有现代浏览器所有现代浏览器所有现代浏览器和 Node.js现代浏览器(旧浏览器需 polyfill)

三、总结

  • XMLHttpRequest (XHR):较旧的技术,支持广泛,但语法较为复杂,支持超时设置、终止请求和进度事件。
  • AJAX:通常指的是使用 XMLHttpRequest 或其他技术来实现异步通信的整体方法,常与 jQuery 等库结合使用,支持超时设置、终止请求和进度事件。
  • Axios:现代的 HTTP 客户端,基于 Promise,提供了更简洁的语法和更强大的功能,支持请求和响应拦截器、取消请求、超时设置和进度事件(通过配置选项)。
  • Fetch API:现代的 HTTP 请求方式,基于 Promise,语法简洁,错误处理更好,但不直接支持超时和进度事件,需要手动实现。

选择哪种技术取决于你的项目需求和浏览器支持情况。对于现代 Web 开发,Axios 和 Fetch API 通常是首选,但在需要兼容旧浏览器的情况下,AJAX 仍然是一个有效的选择。

这篇关于xhr、ajax、axois、fetch的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137356

相关文章

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

Python中@classmethod和@staticmethod的区别

《Python中@classmethod和@staticmethod的区别》本文主要介绍了Python中@classmethod和@staticmethod的区别,文中通过示例代码介绍的非常详细,对大... 目录1.@classmethod2.@staticmethod3.例子1.@classmethod

Golan中 new() 、 make() 和简短声明符的区别和使用

《Golan中new()、make()和简短声明符的区别和使用》Go语言中的new()、make()和简短声明符的区别和使用,new()用于分配内存并返回指针,make()用于初始化切片、映射... 详细介绍golang的new() 、 make() 和简短声明符的区别和使用。文章目录 `new()`

Python中json文件和jsonl文件的区别小结

《Python中json文件和jsonl文件的区别小结》本文主要介绍了JSON和JSONL两种文件格式的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 众所周知,jsON 文件是使用php JSON(JavaScripythonpt Object No

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

什么是 Ubuntu LTS?Ubuntu LTS和普通版本区别对比

《什么是UbuntuLTS?UbuntuLTS和普通版本区别对比》UbuntuLTS是Ubuntu操作系统的一个特殊版本,旨在提供更长时间的支持和稳定性,与常规的Ubuntu版本相比,LTS版... 如果你正打算安装 Ubuntu 系统,可能会被「LTS 版本」和「普通版本」给搞得一头雾水吧?尤其是对于刚入

python中json.dumps和json.dump区别

《python中json.dumps和json.dump区别》json.dumps将Python对象序列化为JSON字符串,json.dump直接将Python对象序列化写入文件,本文就来介绍一下两个... 目录1、json.dumps和json.dump的区别2、使用 json.dumps() 然后写入文

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal