从Request迁移到Got库的完整指南
前言
在Node.js生态系统中,Request曾经是最流行的HTTP客户端库之一。但随着现代JavaScript的发展,Request已经停止维护。Got库作为其优秀替代品,提供了更现代化、更强大的功能。本文将详细指导开发者如何从Request平滑迁移到Got。
基础用法对比
让我们从最基本的HTTP请求开始比较:
Request方式
import request from 'request';
request('https://google.com', (error, response, body) => {
console.log('error:', error);
console.log('statusCode:', response && response.statusCode);
console.log('body:', body);
});
Got方式
import got from 'got';
try {
const response = await got('https://google.com');
console.log('statusCode:', response.statusCode);
console.log('body:', response.body);
} catch (error) {
console.log('error:', error);
}
关键差异点:
- Got默认使用Promise/async-await,而非回调函数
- 错误处理采用try-catch机制
- 响应数据整合在response对象中,结构更清晰
选项参数对照
保持不变的选项
Got保留了以下与Request相同的选项:
url
- 请求地址body
- 请求体followRedirect
- 是否跟随重定向encoding
- 编码格式maxRedirects
- 最大重定向次数headers
- 请求头
重命名的选项
为了更好的可读性,Got对一些选项进行了重命名:
| Request选项 | Got对应选项 | 说明 | |------------|------------|------| | qs
| searchParams
| 查询参数 | | strictSSL
| rejectUnauthorized
| SSL证书验证 | | gzip
| decompress
| 响应解压缩 | | jar
| cookieJar
| Cookie管理 | | jsonReviver
| parseJson
| JSON解析器 | | jsonReplacer
| stringifyJson
| JSON序列化 |
行为变更的选项
agent
选项现在是一个包含http
、https
和http2
属性的对象timeout
选项现在是对象形式,可以设置特定事件的超时searchParams
总是使用URLSearchParams进行序列化- 自定义查询字符串需要通过
url
选项传递
重大变更点
1. JSON和表单处理
json
选项不再是布尔值,而是对象,会被自动序列化为请求体form
选项也是对象,会被序列化为application/x-www-form-urlencoded
格式
2. 头部处理
所有头部名称都会被转换为小写,符合HTTP规范要求。
3. 移除的功能
- 移除了
oauth
、hawk
等认证方式 - 移除了
agentClass
、agentOptions
等选项 - 移除了
forever
选项(需使用keepAlive的agent替代) - 移除了
proxy
选项(需自定义agent实现)
4. 认证方式变更
- 不再使用
auth
选项,改用username
/password
或手动设置authorization
头部
流处理对比
Request的流式处理示例:
http.createServer((serverRequest, serverResponse) => {
if (serverRequest.url === '/doodle.png') {
serverRequest.pipe(request('https://example.com/doodle.png')).pipe(serverResponse);
}
});
Got的等效实现:
import {pipeline as streamPipeline} from 'node:stream/promises';
import got from 'got';
const server = http.createServer(async (serverRequest, serverResponse) => {
if (serverRequest.url === '/doodle.png') {
await streamPipeline(
got.stream('https://example.com/doodle.png'),
serverResponse
);
}
});
Got同样支持流的头部代理功能,且使用了Node.js现代的stream/promises模块。
实用方法对照
- HTTP方法快捷方式:
request.get()
→got.get()
- 默认配置:
request.defaults()
→got.extend()
- Cookie处理:需直接使用tough-cookie库
迁移建议
- 逐步迁移:可以先从简单的GET请求开始,逐步处理复杂场景
- 利用Hooks:Got的Hooks系统非常强大,可以替代Request的许多扩展功能
- 错误处理:注意从回调模式切换到try-catch模式
- 测试验证:迁移后务必进行充分测试,特别是边缘场景
总结
虽然从Request迁移到Got需要一些调整,但Got提供了更现代化、更强大的功能集。通过本文的对照指南,开发者可以系统地完成迁移工作。Got的优秀文档和完善的功能使其成为Node.js HTTP客户端的最佳选择之一。
对于更高级的用法,建议深入研究Got的文档,特别是关于Hooks和自定义实例的部分,这将帮助您充分发挥Got的全部潜力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考