发布于 2026-01-06 2 阅读
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。您只需在选项中设置相应methodbody参数即可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。您也可以在LinkedInDEV上关注我。

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