网站首页 > 技术文章 正文
大家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!
今天给大家带来的主题是Node.js 的终极 HTTP 请求库,即Got。话不多说,直接进入正题
前言
关于前端请求库的选择,以前有发表过很多文章单独介绍过,下面是已经发布的部分文章的传送门,大家感兴趣的可以选择性阅读,更多文章可以继续在我的主页查看。
- 《 Ajax 会被 fetch 取代吗?Axios 怎么办? 》
- 《 为什么 JS 开发者更喜欢 Axios 而不是 Fetch? 》
- 《 为何需要 Axios!Axios 的 5 个热门替代方案! 》
- 《 Node 原生支持 fetch!不是浏览器那个 fetch! 》
- 《 谁在动 Axios 的奶酪!它叫 Redaxios! 》
今天给大家选择的是 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
- 上一篇: 常见的HTTP请求头和响应头
- 下一篇: 大批量接口请求的前端优化
猜你喜欢
- 2025-01-02 前后端数据交互(六)——ajax 、fetch 和 axios 优缺点及比较
- 2025-01-02 前端报504错误如何定位
- 2025-01-02 测试提了个bug,为什么你多了个options请求?
- 2025-01-02 如果用户觉得 web 应用反应卡顿, 主要从哪几个方面来排查?
- 2025-01-02 Vue短文:如何在HTTP请求时传递自定义头部
- 2025-01-02 前端小伙伴,axios 是如何封装 HTTP 请求的?(看完会了吗)
- 2025-01-02 SpringMVC实现原理之DispatcherServlet处理请求的过程
- 2025-01-02 Background Sync出世!前端离线请求火起来?
- 2025-01-02 最简单的 6 种防止数据重复提交的方法!(干货)
- 2025-01-02 跨站请求伪造(CSRF)攻击是什么?如何防御?
你 发表评论:
欢迎- 580℃几个Oracle空值处理函数 oracle处理null值的函数
- 575℃Oracle分析函数之Lag和Lead()使用
- 561℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 560℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 556℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 545℃【数据统计分析】详解Oracle分组函数之CUBE
- 533℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 529℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端懒加载 (49)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)