JavaScript 中 Fetch API 的完整指南

前言

Fetch API 是一种通过 JavaScript 接口从远程或本地服务器获取资源的简单方法。这意味着浏览器可以直接向 Web 服务器发出 HTTP 请求。这是通过 fetch() 方法实现的,该方法返回一个 promise,其响应使用 Response 对象实现。

fetch() 方法采用一个强制参数,该参数是我们要从中获取数据的远程服务器或源的路径。一旦收到响应,开发人员就有责任决定如何处理正文内容并将其显示在某个 HTML 模板中。

简单示例

下面是一个比较基本的 fetch() 示例,它从远程服务器抓取数据:

scss 复制代码
fetch(url)
  .then(
    //handle the response
  )
  .catch(
    //handle the errors
  )

面的示例使用简单的 Promise 来实现 fetch() 方法。我们指定一个 URL,并将其存储在 const 变量中。

使用 fetch() 方法

GET 请求

GET 请求用于从服务器检索数据。默认情况下,除非另有说明,否则所有 HTTP 请求都是 GET

例如,如果我们正在构建一个待办事项列表应用程序,我们需要在前端获取和显示任务。使用 JavaScript,我们可以在 HTML 中定位一个无序列表 (ul),并使用获取的数据动态填充它。以下是我们设置 HTML 结构的方法:

bash 复制代码
<ul id="list">

</ul>

当我们输入待办事项列表项时,它会存储在我们的服务器上。要检索这些项目,我们需要使用 GET 请求。

我们在 JavaScript 中要做的第一件事是通过其 ID 从 DOM 获取 ul 元素,以便我们稍后可以将列表项附加到它:

ini 复制代码
const ul = document.getElementById("list")

然后,我们继续将将我们连接到远程服务器的 API 的 URL 存储在名为 URL 的变量中:

ini 复制代码
const url = "https://jsonplaceholder.typicode.com/todos"

我们已经得到了我们需要的变量。现在我们可以开始使用 fetch() 了。请记住,fetch() 方法只考虑一个参数:URL。在这种情况下,我们将传入我们的 url 变量:

scss 复制代码
fetch(url)

仅此一项无法为我们提供所需的数据,因为响应不是 JSON 格式。我们需要解析它,以便我们可以处理数据并将其显示在我们的 HTML 中。为此,我们使用 .json() 方法:

scss 复制代码
fetch(url)
  .then(response => response.json())

运行 fetch() 后,它返回一个解析为 Response 对象的 promise。这 .then() 方法用于处理此 Response 对象。这 .json() 方法,它返回另一个 promise,该 promise 解析为我们需要的 JSON 数据 :

ini 复制代码
fetch(url)
  .then(response => response.json())
  .then(data => {

  })

第二个 .then() 上述用于处理前面的 .then()data 参数是解析后的 JSON 数据。 现在我们有了数据,我们如何将其输出到 HTML 模板以使其在页面上可见?

我们有一个 ul 元素,我们希望将数据显示为待办事项列表。对于我们获取的每个待办事项,我们将创建一个 li 元素,将文本设置为我们获取的项目,然后将 li 附加到 ul 元素。

ini 复制代码
fetch(url)
  .then(response => response.json())
  .then(data => {
    data.forEach(todo => {
    const li = document.createElement("li")
    li.innerText = todo.title
    ul.appendChild(li)
    })
  })

我们完整的 JavaScript 逻辑应该如下所示:

ini 复制代码
const ul = document.getElementById("list")
const url = "https://jsonplaceholder.typicode.com/todos"

fetch(url)
  .then(response => response.json())
  .then(data => {
    data.forEach(todo => {
    const li = document.createElement("li")
    li.innerText = todo.title
    ul.appendChild(li)
    })
  })

这样,我们应该会看到网页上显示的待办事项列表。默认情况下,JSONPlaceholder 最多返回 200 个待办事项,但我们始终可以使用我们的逻辑来减少这个数字。我们可以获得的不仅仅是待办事项的标题。我们可以找到的更多数据的一个示例可能是任务的状态。

POST 请求

现在我们已经了解了如何从服务器获取数据,我们将了解如何向服务器添加数据。想象一下在网站上填写表格或输入数据。这些数据需要以某种方式进入数据库,我们通常使用 POST 请求来实现这一点。

在我们的 HTML 代码中,我们将有一个带有输入字段和提交按钮的小表单:

bash 复制代码
<form id="todo-form">
        <input type="text" id="todo-input" placeholder="Enter your task here..." required>
        <button type="submit">Add To-do</button>
</form>

然后在 JavaScript 中,我们想要抓取两个元素并指定 URL,通过它发出请求:

ini 复制代码
const form = document.getElementById("todo-form");
const input = document.getElementById("todo-input");

const url = "https://jsonplaceholder.typicode.com/todos"

我们将创建一个事件侦听器,以便每次提交表单时都会发出请求:

csharp 复制代码
form.addEventListener("submit", (event) => {
  event.preventDefault()

})

数据通常作为具有特定键值对的对象发送到后端,这些键值对表示我们想要存储数据的格式。在我们的例子中,我们想要存储待办事项的标题和状态。

例如:

yaml 复制代码
const newToDo = {
  title: input.value,
  completed: false,
}

现在,我们可以开始设置我们的 POST 请求了。与只需要一个参数的 GET 请求不同,POST 请求需要两个参数。第一个是 URL,第二个是包含 methodbodyheaders 键的对象:

css 复制代码
fetch(url, {
    method: "POST",
    body: JSON.stringify(newTodo),
    headers: {
      "Content-Type": "application/json",
    },
})

method键定义正在发出的请求的类型,在本例中,它设置为 POST, 表示我们正在向服务器发送数据。body:包含数据,使用 JSON 格式化为 JSON 字符串。

这些是简单 [POST request](https://blog.logrocket.com/how-to-make-http-post-request-with-json-body-in-go/) .我们最终的 JavaScript 逻辑将如下所示:

ini 复制代码
const form = document.getElementById("todo-form");
const input = document.getElementById("todo-input");

const url = "https://jsonplaceholder.typicode.com/todos";

form.addEventListener("submit", (event) => {
  event.preventDefault();
  const newTodo = {
    title: input.value,
    completed: false,
  };

  fetch(url, {
    method: "POST",
    body: JSON.stringify(newTodo),
    headers: {
      "Content-Type": "application/json",
    },
  });
});

除了 GETPOST 之外,在处理数据时还可以使用各种其他作。您可以访问 MDN 文档以了解有关这些请求以及如何使用它们的更多信息。

如何使用 fetch 标头

除了从客户端提供和接收数据外,服务器还需要了解它收到的每个请求。这可以通过标头实现,标头充当元数据并伴随请求。这些键值对告诉服务器客户端正在发出什么样的请求,以及如何响应它。

要理解标头,我们必须讨论存在的两个类别:获取请求标头和获取响应标头。

获取请求标头

顾名思义,请求标头告诉服务器您正在发出什么样的请求,并且可能包括服务器在响应之前需要满足的条件。

在我们的 POST 示例中,我们使用 Content-Type 标头来指定我们正在发送 JSON 数据。另一个重要的标头是 Authorization,它携带身份验证详细信息,例如用于安全 API 访问的令牌或 API 密钥。Accept 标头告诉服务器我们在响应中喜欢哪种数据格式。

某些标头(称为禁止标头名称)由浏览器自动设置,无法以编程方式修改。这些称为禁止的标头名称

获取响应

当服务器处理请求时,它会使用标头进行响应,这些标头提供有关响应的重要详细信息。

关键响应标头包括状态代码 ,指示请求是成功 (200 OK) 还是遇到问题 (500 服务器错误 ) 。Content-Length 指定返回数据的大小,而 Content-Type 显示格式,例如 JSON 或 HTML。

一些标头在请求和响应中同时发挥作用,例如:

  • Cache-Control:管理浏览器缓存行为。
  • Accept-Encoding:告诉服务器客户端支持哪种压缩格式。

标头有助于简化客户端和服务器之间的通信,改进响应处理。

结论

我们介绍了 Fetch API 的基础知识,从发出简单的 GETPOST 请求到处理错误、处理标头和管理流响应。虽然还有很多东西需要探索,但这个基础使您能够自信地在 JavaScript 中使用 fetch。掌握这些概念将帮助您构建更高效、更可靠的 Web 应用程序。

相关推荐
葡萄城技术团队9 分钟前
SpreadJS 纯前端表格控件:破解中国式复杂报表技术文档
前端
Humbunklung10 分钟前
C# 压缩解压文件的常用方法
前端·c#·压缩解压
通往曙光的路上15 分钟前
时隔一天第二阶段他来了 html!!!!!!!!!!!
前端·html
爱吃甜品的糯米团子31 分钟前
CSS图片背景属性
前端·css
雮尘37 分钟前
一文读懂Android Fragment栈管理
android·前端
Aoda42 分钟前
浏览器字体设置引发的Bug:从一次调查到前端字体策略的深度思考
前端·css
朝与暮43 分钟前
《javascript进阶-类(class):构造函数的语法糖》
前端·javascript
入秋44 分钟前
Three.js 实战之电子围栏可根据模型自动生成
前端·前端框架·three.js
用户6120414922131 小时前
jsp+servlet做的咖啡品牌管理后台
java·前端·后端
Asort1 小时前
JavaScript设计模式(三)——抽象工厂模式 (Abstract Factory)
前端·javascript·设计模式