发布于 2026-01-06 3 阅读
0

JavaScript Fetch API 简介 Fetch API DEV 的全球展示挑战赛,由 Mux 呈现:展示你的项目!

JavaScript Fetch API简介

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

本文最初发表于attacomsian.com/blog。


Fetch API 是一个基于 Promise 的JavaScript API,用于在浏览器中发起异步 HTTP 请求,类似于 XMLHttpRequest (XHR)。与 XHR 不同的是,Fetch API 更简洁,它利用 Promise 提供了更强大、更灵活的功能集,用于从服务器获取资源。

Fetch 函数现在基本已经标准化,除了 IE 之外,所有现代浏览器都支持它。如果您需要支持包括 IE 在内的所有浏览器,只需将GitHub 发布的polyfill添加到您的项目中即可。

API 使用情况

使用 Fetch API 非常简单。只需将 URL(即要获取的资源的路径)传递给fetch()方法即可:

fetch('/js/users.json')
    .then(response => {
        // handle response data
    })
    .catch(err => {
        // handle errors
    });

我们将要检索的资源路径作为参数传递给该方法。它返回一个 Promise,该 Promise 会在资源完成时fetch()将响应传递给该方法。如果由于网络故障或其他原因导致请求未能完成,该方法会拦截错误。then()catch()

GET 请求

默认情况下,Fetch API 使用 GET 方法处理异步请求。让我们使用Reqres REST API,通过 GET 请求来检索用户列表:

fetch('https://reqres.in/api/users')
    .then(res => res.json())
    .then(res => {
        res.data.map(user => {
            console.log(`${user.id}: ${user.first_name} ${user.last_name}`);
        });
    });

上述请求会在控制台上打印以下内容:

1: George Bluth
2: Janet Weaver
3: Emma Wong

调用该fetch()方法会返回一个Promise。该 Promise 返回的响应是一个流对象,这意味着当我们再次调用json()该方法时,它会返回另一个 Promise。调用该json()方法表明我们期望的是一个 JSON 响应。如果您期望的是一个 XML 响应,则应该使用text()其他方法。

POST 请求

与Axios类似,Fetch 也允许在请求中使用任何其他 HTTP 方法:POST、PUT、DELETE、HEAD 和 OPTIONS。您只需在选项中设置相应method的body参数即可fetch():

const user = {
    first_name: 'John',
    last_name: 'Lilly',
    job_title: 'Software Engineer'
};

const options = {
    method: 'POST',
    body: JSON.stringify(user),
    headers: {
        'Content-Type': 'application/json'
    }
}

fetch('https://reqres.in/api/users', options)
    .then(res => res.json())
    .then(res => console.log(res));

Reqres API 会将包含 ID 和创建时间戳的请求体数据返回给我们:

{  
   "first_name":"John",
   "last_name":"Lilly",
   "job_title":"Software Engineer",
   "id":"482",
   "createdAt":"2019-05-12T15:09:13.140Z"
}

删除请求

DELETE 请求与 POST 请求非常相似,区别在于 DELETE 请求body不需要填写任何参数:

const options = {
    method: 'DELETE',
    headers: {
        'Content-Type': 'application/json'
    }
}

fetch('https://reqres.in/api/users/2', options)
    .then(res => {
        if (res.ok) {
            return Promise.resolve('User deleted.');
        } else {
            return Promise.reject('An error occurred.');
        }
    })
    .then(res => console.log(res));

错误处理

由于fetch()该方法返回的是一个 Promise 对象,因此错误处理非常简单。我们可以使用catch()Promise 的 `reject` 方法来拦截请求执行过程中抛出的任何错误。但是,无论服务器返回什么响应,只要请求成功到达服务器并返回,就不会抛出任何错误。fetch()即使 HTTP 响应代码为 404 或 500,该方法返回的 Promise 也不会因 HTTP 错误而拒绝。

幸运的是,你可以使用ok响应对象的属性来检查请求是否成功:

fetch('https://reqres.in/api/users/22') // 404 Error
    .then(res => {
        if (res.ok) {
            return res.json();
        } else {
            return Promise.reject(res.status);
        }
    })
    .then(res => console.log(res))
    .catch(err => console.log(`Error with message: ${err}`));

响应对象

该fetch()方法返回的响应对象包含有关异步调用的请求和响应的信息,包括标头、状态码和状态消息:

fetch('https://reqres.in/api/users')
    .then(res => {
        console.log(res.headers.get('content-type'));
        console.log(res.headers.get('expires'));

        console.log(res.status);
        console.log(res.ok); // shorthand for `status` between 200 and 299 
        console.log(res.statusText);
        console.log(res.redirected);
        console.log(res.type);
        console.log(res.url);
    });

您可以通过以下几种方式访问​​ Fetch API 的响应正文:

  • json()返回正文为 JSON 对象
  • text()返回字符串形式的正文。
  • blob()返回对象为 Blob 对象
  • formData()返回主体作为 FormData 对象
  • arrayBuffer()返回主体作为 arrayBuffer 对象

所有这些方法都会返回一个 Promise 对象。以下是一个方法示例text():

fetch('https://reqres.in/api/unknown/2')
    .then(res => res.text())
    .then(res => console.log(res));

上述网络调用的输出将是一个 JSON 字符串:

'{"data":{"id":2,"name":"fuchsia rose","year":2001,"color":"#C74375","pantone_value":"17-2031"}}'

获取和异步/等待

由于 Fetch 是一个基于 Promise 的 API,我们可以更进一步,使用最新的 ES2017 async/await语法,使我们的代码更简洁,看起来更像同步代码:

const fetchUsers = async () => {
    try {
        const res = await fetch('https://reqres.in/api/users');
        if (!res.ok) {
            throw new Error(res.status);
        }
        const data = await res.json();
        console.log(data);
    } catch (error) {
        console.log(error);
    }
}

fetchUsers();

结论

以上就是关于 JavaScript Fetch API 的全部内容。它相比之前的版本有了巨大的改进,XMLHttpRequest拥有易于使用的界面,并且在获取资源(即使是跨网络)方面表现出色。Fetch API 受所有现代浏览器支持,因此除非您需要支持 IE,否则无需使用任何 polyfill。


✌️ 我撰写关于现代 JavaScript、Node.js、Spring Boot以及所有Web 开发相关内容的文章。订阅我的电子报,每周获取 Web 开发教程和实用技巧。


喜欢这篇文章吗? 请在Twitter上关注@attacomsian。您也可以在LinkedIn和DEV上关注我。

文章来源:https://dev.to/attacomsian/introduction-to-javascript-fetch-api-4f4c