前端请求大比拼:Fetch、Axios、Ajax、XHR
当涉及前端网络请求时,有许多工具/技术可供选择,包括 Fetch、Axios、Ajax 和 XHR 等。这些技术在发送和处理HTTP请求方面提供了不同的功能和方法。本文将深入探讨这些技术的特点、优势和用法,帮你更好地理解并选择最适合项目需求的技术。
Fetch:一种现代化的网络请求方法,通过使用 Promise 处理异步操作,简洁而直观地发送HTTP请求、处理响应,并支持各种功能和API,如设置请求头、传递参数、处理流数据、上传下载文件等。
Axios:一个基于Promise的现代化HTTP客户端,是目前最流行的 HTTP 客户端,可以在浏览器和Node.js环境中发送HTTP请求,并具有拦截请求和响应、支持并发请求、提供丰富的API等功能。
Ajax:通过在浏览器和服务器之间进行异步通信,实现部分页面更新和动态交互,提升用户体验;可以在不重新加载整个页面的情况下,通过Java发送HTTP请求到服务器,并处理服务器返回的数据;减少带宽消耗,提高页面加载速度;提高用户交互性,实现更多的动态效果和实时更新。
XHR:一种在浏览器中用于与服务器进行异步通信的API,通过发送HTTP请求并处理服务器返回的数据,实现异步获取各种格式的数据(如XML、JSON、HTML等),以实现页面的无刷新更新和动态交互。
是一个内置的 Java 对象,(XHR)对象用于与服务器交互。通过 可以在不刷新页面的情况下请求特定 URL,获取数据。这允许网页在不影响用户操作的情况下,更新页面的局部内容。
在 AJAX 编程中被大量使用。尽管名称包含XML, 也可以用于获取任何类型的数据,而不仅仅是 XML。它甚至支持 HTTP 以外的协议(包括 file:// 和 FTP)。
语法复杂性:使用原始的 进行复杂的 AJAX 请求需要编写更多的代码,并手动处理状态管理、错误处理等方面的逻辑。相比之下,Axios 和 Fetch API 提供了更简单和直观的语法,使得发送和处理 HTTP 请求更加方便。
功能限制:XHR 提供的功能相对较少,需要手动设置请求头、处理超时、取消请求等。而 Axios 和 Fetch API 提供了更丰富的功能,如拦截请求和响应、自动转换数据格式、请求取消等。
XSRF(跨站请求伪造)保护:在 Axios 中,可以通过设置 withCredentials 选项来自动处理 XSRF 保护。然而,在 和 Fetch API 中,需要手动设置请求头来实现类似的保护。
错误处理:XHR 的错误处理较为繁琐,需要在回调函数中进行错误判断。而 Axios 和 Fetch API 使用 Promise 和 async/await 语法,能够更便捷地处理请求和响应的错误。
仅限于浏览器环境: 是浏览器提供的 API,因此只能在浏览器环境中使用,无法在其他环境中(如服务器端)直接使用。
这里创建了一个对象,并使用open方法设置了一个GET请求类型和URL。然后,通过监听onreadystatechange事件来判断请求的状态并处理响应。当readyState为4时,表示请求已完成,此时可以通过status属性判断请求是否成功(200表示成功)。如果成功,可以通过responseText属性获取服务器返回的数据进行处理。如果失败,将到控制台输出错误信息。
的 open 方法用于初始化一个请求。open 方法接受三个必填参数和一个可选参数,它们是:
可以使用 setRequestHeader 方法设置 的请求头。这个方法接受两个参数:头字段的名称和值。
这里返回的 headers 是一个包含所有响应头信息的字符串。该字符串中每一行表示一个响应头字段,具有以下形式:
可以使用适当的方法(如字符串解析)将这个字符串进行进一步处理,以获取特定的响应头字段的名称和值。
上面示例中的 readyState 是 对象的一个属性,用于表示请求的状态。该属性有以下五种可能的取值:
通常情况下,我们主要关注 readyState 为 4 的状态,即请求完成状态。在这个状态下,我们可以通过检查 status 属性来获取请求的结果(比如响应状态码),并通过 responseText 或 responseXML 属性来获取服务器返回的数据。
注意,readyState 属性是只读的,我们不能直接修改它的值。它会在请求过程中自动更新,我们可以通过监听 readystatechange 事件来进行相应的处理。
status 是 对象的一个属性,用于表示 HTTP 状态码。HTTP 状态码是服务器对请求处理的结果进行响应的标准化数字代码。常见的一些 HTTP 状态码包括:
在使用 发送请求后,可以通过检查 status 属性来获取服务器对请求的响应状态码,并根据不同的状态码进行相应的处理。
responseType 是 对象的属性,用于指定响应的数据类型。它决定了如何解析从服务器返回的响应数据。 常见的 responseType 值包括:
通过设置不同的 responseType 值,可以根据需要获取不同类型的响应数据。注意,在设置 responseType 之前,最好在调用 open 方法之后、发送请求之前设置,以确保设置生效。
AJAX(Asynchronous Java and XML,异步 Java 和 XML)是一种使用现有的网页技术来创建异步请求和更新页面内容的方法。Ajax 本身不是一种技术,而是一种将一些现有技术结合起来使用的方法,包括:HTML 或 XHTML、CSS、Java、DOM、XML、XSLT、以及最重要的 对象。
当使用结合了这些技术的 Ajax 模型以后,网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面。这使得程序能够更快地回应用户的操作。Ajax 最吸引人的特性是它的“异步”性质,这意味着它可以与服务器通信、交换数据并更新页面,而无需刷新页面。
Ajax 是一种使用浏览器提供的 对象实现的技术,用于在不刷新整个页面的情况下进行异步请求和更新页面内容。可以说 Ajax 是基于浏览器提供的 对象来实现的。
虽然 AJAX 是一种强大的技术,但相对于 Axios 和 Fetch API,它有以下一些缺点:
兼容性问题:AJAX 的兼容性相对较低,尤其在旧版本的浏览器中可能会出现问题。而 Axios 和 Fetch API 使用了更现代的 Java 特性,具有更好的兼容性。
代码冗余:使用原生的 AJAX 需要编写较多的代码来处理不同的状态码、错误处理以及请求的拼装等。而 Axios 和 Fetch API 提供了更简洁和易用的接口,减少了代码冗余。
缺乏默认配置:AJAX 不提供默认的全局配置,如请求和响应、统一的错误处理等。而 Axios 和 Fetch API 支持全局配置,并且提供了更方便的机制。
功能限制:AJAX 在处理跨域请求时需要注意添加额外的处理,比如设置 CORS 头部信息或者使用 JSONP。而 Axios 和 Fetch API 提供了更直接的方式来处理跨域请求。
可读性较差:由于 AJAX 使用的是回调函数来处理异步请求,可能会导致代码逻辑比较复杂,可读性较差。而 Axios 和 Fetch API 使用的是 Promise 或 async/await,使代码结构更加清晰易读。
Fetch 是一种用于进行网络请求的现代 Java API。它提供了一种简单、灵活且功能强大的方式,用于从服务器获取资源并处理响应。
Fetch API 在浏览器中原生支持,并且以 Promise 为基础,使得异步请求更加直观和易用。使用 Fetch API,可以执行各种类型的请求(如 GET、POST、PUT、DELETE 等),发送请求时可以设置请求头、请求参数,以及处理响应数据。
Promise 支持:Fetch API 使用 Promise 对象来处理异步操作,使得处理异步请求的流程更加清晰、易于阅读和编写。
更简洁的 API:Fetch API 提供了一个简洁的 API,使发送请求变得更加直观和简单,同时提供了丰富的配置选项(如设置请求头、请求参数等)。
内置的 JSON 解析:在处理响应时,Fetch API 内置了对 JSON 数据的解析,无需手动进行解析操作。
更好的错误处理:Fetch API 使用了更全面的错误处理机制,允许通过检查响应状态码来确定请求是否成功,并以不同的方式处理错误。
Fetch API 提供了一个全局的 fetch 方法,该方法提供了一种简单、逻辑的方式来通过网络异步获取资源。
注意,fetch默认使用的是 GET 请求,如果需要使用其他方法(如 POST、PUT 等),需要通过 options 参数进行设置。
fetch 方法返回一个 Promise 对象,可以使用 .then 方法来处理成功的响应,使用 .catch 方法来处理错误的情况。
我们可以使用 response.type 来确定响应的类型,并根据不同的类型采取相应的处理方法:
Response 对象提供了 5 个方法,用于从 HTTP 响应中获取不同类型的数据:
这些方法返回一个 Promise,当解析完成时,Promise 将被解析为相应的数据类型。
fetch 函数的请求头包含在发起 HTTP 请求时发送给服务器的信息,用于传递额外的参数和配置。可以使用 headers 对象来设置和操作请求头。常见的请求头字段包括:
响应头是服务器在响应 HTTP 请求时发送给客户端的头部信息。可以通过 Response 对象的 headers 属性访问响应头。常见的响应头字段包括:
除了可以使用 catch 来处理错误之外,与使用其他异步操作一样,我们也可以使用 async/await 来处理异步请求,使代码更加简洁和易读:
在标准的 Fetch API 中,没有提供直接取消 Fetch 请求的内置方法。但是,可以使用以下方法来模拟或实现取消 Fetch 请求的效果。
浏览器和 Node.js:Axios 可在浏览器和 Node.js 环境中使用,可以在不同的平台上执行 HTTP 请求。
Promise API:Axios 使用 Promise API 进行异步操作,能够更轻松地处理异步请求和响应。
请求拦截和响应拦截:可以通过,在请求发送之前或响应返回之后对请求进行全局性或个性化的变换和处理。可以在请求或响应的不同阶段添加公共的请求头、验证身份、处理错误等。
取消请求:Axios 允许取消未完成的请求,以避免无效的请求,并减轻服务器的负担。取消请求可以通过创建取消令牌、使用取消令牌进行请求配置或者在中中断请求来实现。
并发请求:Axios 提供了执行多个并发请求的能力,可以同时发起多个请求,并在所有请求完成后进行处理。
自动转换数据:Axios 可以自动将请求和响应的数据进行格式转换,包括 JSON、URL 编码等。无需手动处理数据转换的过程。
错误处理机制:当请求过程中出现错误时,Axios 会返回详细的错误信息,包括 HTTP 错误状态码、错误描述等。可以根据需要对这些错误进行处理和显示。
简洁的 API:Axios 的 API 设计简洁易用,具有直观的方法命名和参数配置。可以轻松地使用 Axios 进行 GET、POST、PUT、DELETE 等常见的 HTTP 请求。
这里使用 axios.get 方法发起了一个 GET 请求,并将请求的 URL 作为参数传递给该方法。然后使用 Promise 的 .then 方法处理成功响应,并通过 response.data 获取响应数据。如果请求失败,可以通过 Promise 的 .catch 方法捕获错误。
对于这些方法,第一个参数是请求的 URL,config 和 data 分别是请求的配置项和请求参数,这两个参数都是可选的。例如,下面是一个 post 请求:
可以看到,在 .then 方法中使用了 axios.spread 函数将多个请求的响应结果进行解构,通过多个参数分别接收各个请求的响应。可以根据实际情况命名这些参数,并通过 response1.data、response2.data 等方式获取各个请求的响应数据。
在 Axios 中,可以使用 transformRequest 方法在请求发送之前对请求数据进行转换和处理,它是一个请求,是一个可选的函数。
这里使用 Axios 发起了一个 POST 请求。通过传递包含 transformRequest 函数的配置对象来定义请求。在 transformRequest 函数内部,复制了原始的请求数据 data,并进行了一些修改和处理,如添加了额外的字段和修改了请求头信息。最终,将修改后的数据以 JSON 字符串的形式返回。Axios 将使用 transformRequest 函数返回的结果作为实际发送请求的数据。
除了可以对请求进行拦截之外,Axios 还支持对响应进行拦截,对响应数据进行转换和处理。可以通过 transformResponse 响应来实现。该函数接收一个参数:responseData,它是从服务器接收到的原始响应数据。可以在 transformResponse 函数内部对这个参数进行修改,并将修改后的值返回。返回的结果将作为实际处理响应的数据。
这里使用 Axios 发起了一个 GET 请求,并通过传递包含 transformResponse 函数的配置对象来定义请求。在 transformResponse 函数内部,对从服务器接收到的响应数据 data 进行了一些修改和处理,如解析 JSON 字符串,添加了额外的字段。最终将修改后的数据返回。
Axios 中,可以使用来拦截请求和响应,并在其被发送或接收之前进行一些额外的处理,可以通过erceptors 对象来添加。
这里首先使用 方法添加了一个请求。该在发送请求之前被调用,并接收请求配置对象 config 作为参数。可以对请求配置进行修改,如添加请求头信息。最后,要确保返回修改后的配置对象。
接下来,使用 axios.interceptors.response.use 方法添加了一个响应。该在接收到响应数据之前被调用,并接收响应对象 response 作为参数。可以对响应数据进行修改,如添加额外的字段。同样,要确保返回修改后的响应对象。
跨站请求伪造(简称 XSRF)是一种攻击 Web 应用的方法,其中攻击者将自己伪装成合法且受信任的用户,以影响应用程序与用户浏览器之间的交互。 有很多方法可以执行此类攻击,包括 。
幸运的是,Axios 通过允许在发出请求时嵌入额外的身份验证数据来防止 XSRF。 这使得服务器能够发现来自未经授权的位置的请求。以下是使用 Axios 完成此操作的方法:
Axios 的另一个有趣的功能是能够监控请求的进度,这在下载或上传大文件时特别有用,可以使用 onUploadProgress 和 onDownloadProgress 两个配置选项来实现。
对于上传进度,可以使用 onUploadProgress 配置选项。它会在上传数据时触发,并提供关于上传进度的信息。
这里发送了一个 POST 请求,在配置选项中使用了 onUploadProgress。当数据上传过程中触发进度事件时,回调函数会被执行。在回调函数中,我们计算出了已上传数据的百分比,并将其打印出来。
对于下载进度,可以使用 onDownloadProgress 配置选项。它会在接收到响应数据时触发,并提供关于下载进度的信息。
这里发送了一个 GET 请求,在配置选项中使用了 onDownloadProgress。当数据下载过程中触发进度事件时,回调函数会被执行。在回调函数中,我们计算出了已下载数据的百分比,并将其打印出来。
在 Axios 中,可以使用取消令牌(cancel token)来取消请求。取消令牌是一个对象,它表示一个具体的取消操作,并允许在需要时中止请求。
这里,先创建了一个取消令牌源 source。然后,发送 GET 请求时将 cancelToken 配置选项设置为 source.token,即将取消令牌与该请求关联起来。当需要取消请求时,调用 source.cancel 方法,并传入取消请求的原因作为参数。
在请求的 .catch 方法中,我们使用 axios.isCancel(error) 来判断捕获的错误是否是一个已取消的请求。如果是取消请求导致的错误,则会打印出 请求已被取消 的提示信息。否则,将打印出其他类型的错误。
可以使用 timeout 配置选项设置 Axios 请求的超时时间,这个选项指定了请求在多少毫秒后如果没有得到响应就会超时。
发送了一个 GET 请求,并在配置选项中设置了 timeout 为 5000 毫秒(即 5 秒)。如果请求在 5 秒内没有得到响应,就会触发超时错误。在超时错误的情况下,请求会被自动取消,球速体育并且进入 .catch 分支。您可以根据需要进行错误处理。
注意,如果不设置 timeout 选项,默认情况下 Axios 请求是没有超时限制的。
相对于 Fetch、 和 Ajax,我还是更喜欢 Axios。它提供了简洁易用的 API,统一的错误处理和支持,取消请求和超时处理功能,以及基于 Promise 的链式调用和跨浏览器兼容性。这些特性使得使用 Axios 更方便、高效,并提供更好的开发体验。
您可能感兴趣的文章
- 10-27将网络操作系统变成现实 ajaxWindows正式上线
- 10-27AJAX的应用
- 10-27jquery-django项目的csrf保护导致ajax请求返回403
- 10-27Ajax的使用方法和原理讲解
- 10-27总结Ajax的用法
- 10-26Spring Cloud + Vue 前后端分离
- 10-26vue中怎么引入layui
- 10-26vue怎么动态引入img标签
- 10-26Web前端:确保项目成功的10大Web开发框架
- 10-26vue监听滚动事件如何实现滚动监听
阅读排行
推荐教程
- 10-12期货投资新手如何入门?
- 09-03明日之后第三季新手任务怎么过 第三季教程剧情彩蛋详解
- 09-19iPhone 16最大的卖点竟是苹果花钱买来的?!
- 10-09XTools十周年十大里程碑事件
- 07-18P2P到底是什么意思
- 09-14Java EE轻量级框架整合开发教与学(教案+大纲+源码+PPT+视频彭之军)
- 09-25世界这么大 为嘛这的西瓜能过生日
- 10-09ajax基本用法
- 08-0690%中国人都会读错的5个汽车名词你能读对几个?
- 08-11AJAX新技术借力Web应用增长 催生在线版Office