Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Request请求库被废弃了! 我们该用什么替代?

Request请求库被废弃了! 我们该用什么替代?

作者头像
治电小白菜
发布于 2020-08-25 07:56:45
发布于 2020-08-25 07:56:45
3K00
代码可运行
举报
文章被收录于专栏:技术综合技术综合
运行总次数:0
代码可运行

可以看到, Request 在 2020.2.11 就被废弃了, 几乎接触过Node的人都接触过Request, 通过看到一个个库的废弃, 停止支持以及转手, 我们可以看到开源事业的艰辛

image.png

当然, 既然Request废弃了, 我们也得继续找个靠谱的请求库啦! 那就是got

GOT

性能对比

下图时官方文档中将 gotrequest, node-fetch, ky, axios, superagent这几个常用的HTTP请求库功能上的对比, 可以看到got的功能还算全面, 虽然不支持浏览器端使用...

性能

迁移指南

从其他HTTP请求库迁移到Got

从 Request 迁移

你可能觉得迁移会很麻烦, 但是并不是. ?

让我们从Request的文档中拿出第一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const request = require('request');

request('https://google.com', (error, response, body) => {
    console.log('error:', error);
    console.log('statusCode:', response && response.statusCode);
    console.log('body:', body);
});

使用GOT, 可以这样写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const got = require('got');

(async () => {
    try {
        const response = await got('https://google.com');
        console.log('statusCode:', response.statusCode);
        console.log('body:', response.body);
    } catch (error) {
        console.log('error:', error);
    }
})();

看起来很棒, 是不是? ?

常用选项

Request 和 Got 都支持 http.request 的选项.

这些 Got 选项和 Request 的一样:

所以如果你很熟悉他们, 你可以很好的上手.

哦, 还有一件事... 没有time 选项. 假设 这是对的.

重命名的选项

可读性对于我们来说很重要, 所以我们给这些选项重新命名:

更清楚了, 不是吗?

行为改变

timeout 选项 有了一些额外的功能. 你可以查看 设置特定事件超时!

searchParams 选项 总是使用 URLSearchParams 除非它是字符串string.

使用streams的话, 只需要 调用got.stream(url, options) 或者 got(url, {isStream: true, ...}).

重大变化
  • json 选项不是boolean类型, 而是 Object类型. 他将被序列化并当作body使用.
  • form 选项是 Object类型. 他可以是一个普通对象或者一个form-data 实例.
  • 没有 oauth/hawk/aws/httpSignature 选项. 标记请求, 你需要创建一个自定义实例.
  • 没有 agentClass/agentOptions/pool 选项.
  • 没有 forever 选项. 你需要使用forever-agent.
  • 没有proxy 选项. 你需要使用pass a custom agent.
  • 没有 auth 选项. 你需要使用 username / password 代替.
  • 没有 baseUrl 选项. 使用 prefixUrl代替, 如果不存在就用斜杠代替. 除非URL是一个实例, 否则它将始终是前置.
  • 没有 removeRefererHeader 选项. 你可以移除 referer 头 在beforeRequest 钩子里:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const gotInstance = got.extend({
    hooks: {
        beforeRequest: [
            options => {
                delete options.headers.referer;
            }
        ]
    }
});

gotInstance(url, options);
  • 没有 jsonReviver/jsonReplacer选项, 但是你可以使用钩子来解决:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const gotInstance = got.extend({
    hooks: {
        init: [
            options => {
                if (options.jsonReplacer && options.json) {
                    options.body = JSON.stringify(options.json, options.jsonReplacer);
                    delete options.json;
                }
            }
        ],
        beforeRequest: [
            options => {
                if (options.responseType === 'json' && options.jsonReviver) {
                    options.responseType = 'text';
                    options.customJsonResponse = true;
                }
            }
        ],
        afterResponse: [
            response => {
                const {options} = response.request;
                if (options.jsonReviver && options.customJsonResponse) {
                    response.body = JSON.parse(response.body, options.jsonReviver);
                }

                return response;
            }
        ]
    }
});

gotInstance(url, options);

钩子是非常有用的, 不是吗? 查看更多 看看钩子还能实现什么.

关于流的更多信息

让我们快速看下 Request 的文档中的另一个示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http.createServer((request, response) => {
    if (request.url === '/doodle.png') {
        request.pipe(request('https://example.com/doodle.png')).pipe(response);
    }
});

很酷的功能是, Request 可以代理请求头和流, 当然Got也能做到:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const stream = require('stream');
const {promisify} = require('util');
const got = require('got');

const pipeline = promisify(stream.pipeline);

http.createServer(async (request, response) => {
    if (request.url === '/doodle.png') {
        // 当有人向我们的服务器发出请求时,我们会收到一个body和一些请求头.
        // 这些被传递给Got. 代理将会将数据下载到我们服务器,
        // 所以你不必使用`response.writeHead(statusCode, headers)` 和 `response.end(body)`.
        // 这些将自动完成.
        await pipeline(
            got.stream('https://example.com/doodle.png'),
            response
        );
    }
});

一切都没有真正改变. 只是记得使用 got.stream(url, options) 或者 got(url, {isStream: true, …}). 仅此而已!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
35·灵魂前端工程师养成-使用nodejs实现简单nginx功能
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/10/31
6860
35·灵魂前端工程师养成-使用nodejs实现简单nginx功能
morgan nodejs日志组件两种用法
默认morgan没有提供记录请求参数和请求内容的方法, 但是他提供了扩展方法,如下:
mafeifan
2018/09/10
1.4K0
36·灵魂前端工程师养成-[前后分离]AJAX实战Cookie、Session
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
8450
36·灵魂前端工程师养成-[前后分离]AJAX实战Cookie、Session
node网络请求库对比
在研究了各种Node.js网络库之后,我发现了一些流行的选项,它们具有不同的功能和稳定性。以下是一些最常用的库及其各自的GitHub星级:
爱吃大橘
2023/04/22
1.4K0
记入一次爬虫之旅
The "Node.js way" is to use streams when possible. You can pipe res.body to another stream. This example uses stream.pipeline to attach stream error handlers and wait for the download to complete.
用户4792657
2022/07/06
6400
从Generator入手读懂 co 模块源码(干货)
本文主要会讲 Generator 的运用和实现原理,然后我们会去读一下 co 模块的源码,最后还会提一下 async/await。
coder_koala
2020/09/08
7060
从Generator入手读懂 co 模块源码(干货)
前端 er,什么时候,你想写一个 HTTP 服务器?
当你第一次接触工程化的项目时,看到项目控制台正在 building,过一会突然跳出一个 URL 地址,你点开它居然是你刚写好的网页,好神奇。
杨成功
2022/03/09
1.1K0
14·灵魂前端工程师养成-代码实现HTTP
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
4640
14·灵魂前端工程师养成-代码实现HTTP
node.js的request模块
更多使用方法和说明可点击这里继续阅读:https://github.com/mikeal/request/
meteoric
2018/11/16
3.2K0
邂逅Node.JS的那一夜
本篇文章,并不完全适合小白,需要有一定的HTML、CSS、JS、HTTP、Web等知识及基础学习:
Java_慈祥
2024/08/03
3080
邂逅Node.JS的那一夜
【黄啊码】如何使用node.js下载图片
前边我们用php访问远程服务器图片,今天又出了另一个想法,怎么使用node.js去下载图片呢? 我正在尝试编写一个脚本来使用node.js下载图像
黄啊码
2022/06/10
2.3K0
32·灵魂前端工程师养成-[前后分离]AJAX原理及JSON详解
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/10/31
1.3K0
32·灵魂前端工程师养成-[前后分离]AJAX原理及JSON详解
小程序开发技巧总结(三)-- 云开发时效数据刷新和存储 (access_token等)
小程序中经常有需要进行OCR识别,或者使用外部api例如百度AI识别等接口,请求调用这些接口需要令牌,即一些具有时效性的数据。本文以小程序云开发使用百度API接口为例,介绍access_token定时刷新和请求机制。
Kindear
2020/03/19
1.6K0
小程序开发技巧总结(三)-- 云开发时效数据刷新和存储 (access_token等)
34·灵魂前端工程师养成-[前后分离]跨域、CORS、JSONP
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/10/31
1.4K0
34·灵魂前端工程师养成-[前后分离]跨域、CORS、JSONP
Infura 以太坊 API 入门教程
因此,你想使用Infura的API访问以太坊网络-你将如何做?首先,你需要确保你拥有Infura帐户(查看此教程 申请账号!)接下来,需要确定要使用哪个接口 - Infura在HTTPS和WebSocket接口上都支持JSON-RPC。在本教程中,我们介绍使用每个接口的原因,以及将通过Node.js示例介绍两种访问以太坊API的方法。
Tiny熊
2020/11/03
2.6K0
Infura 以太坊 API 入门教程
Node.js 模拟本地接口测试环境以及简单的代理转发服务
老猫-Leo
2023/12/11
5860
Electron+Vue使用Nodejs开发爬虫
String - You can request the following paths by the name:
码客说
2020/11/13
1.7K0
关于前端请求跨域问题解决方案
这个错误是由于浏览器的跨域资源共享(CORS)策略引起的。网页从一个域名(例如'http://127.0.0.1:8848')请求另一个域名(例如'http://192.168.16.107:8092')的资源时,浏览器会阻止这个请求,除非服务器在响应中包含了适当的CORS头信息。
王小婷
2023/09/20
1.8K0
关于前端请求跨域问题解决方案
新浪微博 OAuth2 NodeJs发微博
想用nodejs写个微博客户端发微博,无奈新浪微博的nodejs sdk是OAuth1.0的。 只能自己根据OAuth1.0 改了改。 只写了statuses/update 和 statuses/upload,其他的实现基本都类似了。 update是简单参数的post,upload是multipart 包含二进制图片的post。 改改帐号参数和发送的图片路径,node weibotest.js就能成功发送了。 如果中文出现乱码,请把这两个js文件保存成utf-8编码。 weibo.js
井九
2024/10/12
2370
使用一个网站链接来按照目录下载存放网站资源,使用资源列表批量下载资源,自动分目录存放
拿我格子衫来
2024/09/26
3230
相关推荐
35·灵魂前端工程师养成-使用nodejs实现简单nginx功能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档