如何在 JavaScript 中使用 Fetch API

在 Web 开发中,您经常需要与其他 Web 服务器连接/通信以获取信息/数据。例如,在某些网站上注册新帐户时,您通常会看到使用 Gmail 或其他第三方帐户进行注册的选项。这使您只需单击一下即可注册一个新帐户,而无需手动填写整个表格。当您选择“使用第三方帐户注册”选项时,应用程序会与第三方应用程序的服务器通信并发送请求以访问您存储在那里的信息。这个请求是通过 API 发送的,API 是一组规则,用于管理不同的应用程序或系统如何相互通信。在本文中,我们将学习使用 JavaScript 发送此类请求。

什么是Fetch API

Fetch API 在 JavaScript 中提供了一个简单的fetch()方法,用于跨网络获取、访问和操作资源。fetch()方法允许您使用以前使用 XMLHttpRequest 进行的JavaScript 进行异步 JavaScript 和 XML (AJAX) 调用。异步请求与主程序并行运行,并且不会停止执行它们下面的代码。即使 API 没有发回任何响应,Fetch API 请求下方的代码也会继续运行。当 API 响应 AJAX 调用时,将恢复fetch()方法。

Fetch API 使用 Promise 并提供强大的功能,使处理 Web 请求及其响应变得更加容易;这是避免使用 XMLHttpRequest 时创建的回调地狱的好方法。

注意:浏览器控制台用于本文示例的演示。

JavaScript 中 Fetch API 的语法

我们需要调用fetch()方法才能在我们的 JavaScript 代码中使用 Fetch API。fetch()方法将API 的 URL 作为参数。

fetch(URL)

我们需要在fetch()方法之后定义then( )方法:

.then(function() {

})

fetch()方法的返回值是一个承诺。如果该承诺得到解决,则执行then()方法主体中的代码。then()方法的主体应该包含可以处理 API 发送的数据的代码。

然后我们需要定义catch()方法;catch()方法仅在 promise 被拒绝的情况下执行:

.catch(function() {
});

总而言之fetch()方法应该是这样的:

fetch(url)
.then(function() {

})
.catch(function() {

});

现在我们已经了解了 Fetch API 的语法,现在我们可以继续讨论在真实 API 上使用 fetch ()方法的真实示例。

如何使用 Fetch 方法从 API 获取数据

在本例中,我们将使用 GitHub 用户的 API 来获取用户信息数据,并仅使用原生 JavaScript 将其显示在控制台上;所以让我们开始吧:

首先,我们将创建一个名为url的变量;此变量将保存 API 的 URL,该 URL 将返回名为fabpot的用户的存储库:

const url = 'https://api.github.com/users/fabpot/repos';

现在我们将使用fetch()方法来调用 GitHub 用户 API;

fetch(URL)

fetch()方法将URL 作为参数:

fetch(url)
.then(function(data) {

})
})
.catch(function(error) {

});

在上面给出的代码中,我们调用了 Fetch API从 GitHub获取名为fabpot的用户的存储库。我们已将 URL 作为 Fetch API 的参数传递给 GitHub 用户 API。然后 API 会发回一个响应,该响应是一个包含一系列方法的对象;这些方法可用于对接收到的信息执行不同的功能。如果我们想将对象转换为 JSON,那么我们可以使用 json() 方法。

要将对象转换为 JSON,我们需要添加then()方法。then()方法将包含一个函数;该函数将接受一个名为 response 的参数:

fetch(url)
.then((response) => )

响应参数用于存储从 API 返回的对象。使用 json() 方法将此对象转换为 JSON 数据:

fetch(url)
.then((response) => response.json())

现在我们可以通过添加另一个then()语句以 JSON 的形式输出数据;此语句包含一个函数,该函数将名为 data 的变量作为参数:

.then(function(data) {

})
})

然后我们使用函数体内的 console.log() 方法将数据输出到控制台。

.then(function(data) {
console.log(data);
})

现在我们将添加 catch() 函数以将潜在错误记录到控制台,以防 promise 未实现:

.catch(err {
console.error(err);
});

总而言之,从 GitHub 获取用户存储库列表的请求应如下所示:

const url = 'https://api.github.com/users/fabpot/repos';
fetch(url)
        .then((response) => response.json())
        .then((data) =>
            console.log(data)
        )
        .catch((err) =>
            console.error(err)
        );// JavaScript Document

在上面给出的屏幕截图中,promise 已解决,并且.then()方法的主体已执行。如果由于某种原因 promise 仍未解决,则.catch()方法的主体将被执行,该方法将完成所有错误处理。我们刚刚使用.catch()方法打印了一条错误消息,以防 promise 未实现。

结论

从第三方来源通信和获取数据是 Web 开发的重要组成部分。它是通过使用一个名为 XMLHttpRequest 的复杂工具实现的,该工具会导致回调地狱;现在,一个更简单的工具称为 Fetch API 用于在 Vanilla JavaScript 中发送 AJAX 调用,因为它在处理 AJAX 请求方面要好得多。在这篇文章中,我们学习了使用 Fetch API 方法在 vanilla JavaScript 中进行 AJAX 调用。

JavaScript中的fetch API虽然提供了强大的网络请求能力,但它不像axios那样内置有请求和响应拦截器。因此,实现全局拦截功能需要一些额外的编程技巧。通过设计自定义的拦截器,我们可以在fetch请求发送前后执行一些通用的操作,如添加认证令牌、处理错误和日志记录等。具体实现方法如下: 参考资源链接:[JavaScript fetch请求拦截详解与示例](https://wenku.csdn.net/doc/6459ff41fcc5391368262693?spm=1055.2569.3001.10343) 首先,理解axios拦截器的工作原理对于设计fetch拦截器是非常有帮助的。在axios中,拦截器允许我们在请求发送到服务器之前或者在接收到响应之后添加一些自定义的行为。我们可以采用类似的思想,通过封装fetch函数来创建一个拦截器。 以下是一个具体的示例代码,展示了如何创建一个全局的fetch拦截器: ```javascript // 创建一个通用的fetch拦截器 function createFetchInterceptor() { // 返回一个新的函数,这个函数将拦截所有的fetch请求 return function(request) { // 在请求发送之前修改请求,例如添加认证令牌 if (localStorage.getItem('token')) { request.headers.set('Authorization', `Bearer ${localStorage.getItem('token')}`); } // 使用原生fetch发送请求,并在获取响应后添加自定义行为 return fetch(request).then(response => { // 检查响应状态码,并进行相应的处理 if (!response.ok) { // 如果响应不是200-299范围内的状态码,抛出错误 throw new Error(`HTTP error! status: ${response.status}`); } // 处理响应体,并返回转换后的结果 return response.json(); }).catch(error => { // 在这里处理网络错误 console.error('Fetch request failed:', error); }); }; } // 使用创建的拦截器替换原生的fetch global.fetch = createFetchInterceptor(); // 使用新的拦截器发送请求 fetch('***', { method: 'GET' }).then(response => { console.log(response); }).catch(error => { console.error(error); }); ``` 在上述代码中,我们首先定义了一个`createFetchInterceptor`函数,它返回一个新的函数用于拦截fetch请求。在这个拦截器函数中,我们可以在发送请求之前添加必要的headers,例如认证信息。同时,在响应返回之后,我们可以处理不同的HTTP状态码,并根据业务逻辑进行错误处理或其他操作。 通过这种方式,我们可以在整个应用范围内统一处理所有的fetch请求,这不仅简化了代码,还提高了代码的可维护性。这种自定义拦截器的方法在处理登录鉴权、请求错误等场景时尤其有用。 推荐在进一步深入学习之前,详细阅读《JavaScript fetch请求拦截详解与示例》这本书。这本书详细讲解了如何在JavaScript使用fetch API实现请求的全局拦截与处理,提供了丰富的示例代码,能够帮助开发者更好地理解并应用这些技术,以便在实际项目中实现高效的网络请求管理。 参考资源链接:[JavaScript fetch请求拦截详解与示例](https://wenku.csdn.net/doc/6459ff41fcc5391368262693?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值