专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

got:这才是 Node.js 的终极 HTTP 请求库!

ins518 2025-01-02 17:09:28 技术文章 37 ℃ 0 评论

家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

今天给大家带来的主题是Node.js 的终极 HTTP 请求库,即Got。话不多说,直接进入正题

前言

关于前端请求库的选择,以前有发表过很多文章单独介绍过,下面是已经发布的部分文章的传送门,大家感兴趣的可以选择性阅读,更多文章可以继续在我的主页查看。

今天给大家选择的是 got 这个请求库,由前端大佬 sindresorhus 开发维护。

目前 got 请求库在 Github 上通过 MIT 协议开源,有超过 13.1k 的 star、1k 的 fork、5485k 的项目依赖量,200+的代码贡献者,妥妥的前端优质开源项目。

1.Got 高级特性

默认情况下,Got 请求库会在请求失败时自动发起重试,如果要禁用此选项,可以将 options.retry.limit 设置为 0。Got 请求库的诸多特性主要包括:

  • 丰富的 API 支持 :支持 Promise 、流 、分页、高级设置 HTTPS 、HTTP/2 等等
  • 超时和重试 :高级超时处理 、失败重试 、元数据错误
  • 高级特性: 支持 Hooks、 Got 实例 、进度事件和其他事件、插件、组合等
  • 缓存、代理和 UNIX 套接字: 符合 RFC 的缓存 、代理支持、 Unix 域套接字
  • 集成:支持 TypeScript 、AWS、测试等等

同时 Got 提供了从 Axios、Node.js 等不同请求库迁移的完整文档,开发者可以轻松适应和完成迁移。同时在,在插件生态上,Got 也非常完善,比如下面是不同场景集成的插件列表:

  • got4aws :Got 与 AWS v4 签名 API 交互的便利包装器
  • gh-got :Got 与 GitHub API 交互的便利包装器
  • gl-got:Got 与 GitLab API 交互的便利包装器
  • gotql :使用 JSON 解析的查询而不是字符串获得方便的包装器与 GraphQL 交互
  • got-fetch :Got 提供给 fetch 的请求接口
  • got-scraping :专门为网络爬虫设计的包装器
  • got-ssrf : Got 的包装器以保护服务器端请求免受 SSRF 攻击

2.为什么选择 Got

很多人会有此疑问,有那么多优秀的请求库,Node.js 端的、浏览器端的、同构的,为什么还要使用 Got 呢?

根据官网描述,Got 是用于 Node.js 环境的人性化且功能强大的 HTTP 请求库,因此从描述上就能看出 Got 主要关注点就是 Node.js 环境。当然,如果要在浏览器环境使用,可以借助于 Ky 请求库,也是由同一个人,即 sindresorhus 开发的非常优秀的请求库。

但是,Ky 主要针对现代浏览器和 Deno 环境,对于旧版浏览器,开发者需要转译并使用 fetch polyfill 和 globalThis polyfill。同时,对于同构需求(Node.js + 浏览器,如 SSR)可以使用 ky-universal。

如上图所示,在 HTTP/2、Stream API、分页 API、RFC 缓存、开箱即用 Cookies、高级超时设置等诸多维度上 Got 明显会优于传统的请求库,如:node-fetch、ky、axios、superagent 等等。所以,个人觉得在 Node.js 环境中是值得尝试下 Got 请求库的。

3.如何使用 got

3.1 基础使用

首先需要安装 got:

npm install got

需要注意的是,got 包基于原生 ESM,不再提供 CommonJS 导出。 如果项目使用 CommonJS,则必须转换为 ESM 或使用动态 import() 函数,Got 有一个专门用于处理 JSON payload 的选项。 此外,promise 公开了一个返回 Promise 的 .json() 函数。

import got from "got";
const url = "https://httpbin.org/anything";
const response = await got(url);

该调用返回一个 Promise。如果 body 中包含 JSON,可以直接获取:

import got from "got";
const url = "https://httpbin.org/anything";
const data = await got(url).json();

类似的 got.text() 方法返回纯文本,所有 got 方法都接受一个选项对象来传递额外的配置,例如标头:

import got from "got";
const url = "https://httpbin.org/anything";
const options = {
  headers: {
    "Custom-Header": "Quick start",
  },
  timeout: {
    send: 3500,
  },
};
const data = await got(url, options).json();

POST 请求非常相似:

import got from "got";
const url = "https://httpbin.org/anything";
const options = {
  json: {
    documentName: "Quick Start",
  },
};

const data = await got.post(url, options);

请求正文在 options 对象中传递,json 属性将相应地自动设置标头,比如上面的例子。

3.2 支持 Stream

Stream API 允许利用 Node.js Streams 功能:

import fs from "node:fs";
import { pipeline as streamPipeline } from "node:stream/promises";
import got from "got";
const url = "https://httpbin.org/anything";
const options = {
  json: {
    documentName: "Quick Start",
  },
};
const gotStream = got.stream.post(url, options);
const outStream = fs.createWriteStream("anything.json");

try {
  await streamPipeline(gotStream, outStream);
} catch (error) {
  console.error(error);
}

3.3 设置超时

默认情况下,got 请求没有超时设置,但是允许开发者自己配置。

import got from "got";

const options = {
  timeout: {
    request: 10000,
  },
};

const client = got.extend(options);

export default client;

上面为导出的客户端发出的所有请求设置了 10000 毫秒的全局超时。当然,与所有选项一样,超时也可以在请求级别设置。

3.4 失败重试

默认情况下,got 失败的请求会重试两次,可以使用 retry 选项对象调整重试策略。

import got from "got";

const options = {
  retry: {
    limit: 5,
    errorCodes: ["ETIMEDOUT"],
  },
};

3.5 Hooks

Hooks 是在某些请求事件上调用的自定义函数:

import got from "got";

const logRetry = (error, retryCount) => {
  console.error(`Retrying after error ${error.code}, retry #: ${retryCount}`);
};
const options = {
  hooks: {
    beforeRetry: [logRetry],
  },
};

const client = got.extend(options);
export default client;

需要注意的是,Hooks 是作为数组给出的,因此可以设置多个 Hooks。

4.本文总结

本文主要和大家介绍一个全新的 Node.js 的终极 HTTP 请求库,即 Got。相信通过本文的阅读,大家对 Got 会有一个初步的了解。

因为篇幅有限,文章并没有过多展开,如果有兴趣,可以在我的主页继续阅读,同时文末的参考资料提供了大量优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏!

参考资料

https://github.com/sindresorhus/got#main-api

https://github.com/sindresorhus/got/blob/main/documentation/quick-start.md

https://github.com/sindresorhus/ky

https://github.com/sindresorhus/got/blob/main/documentation/3-streams.md#events

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表