深入解析Node.js中5种发起HTTP请求的方法

简介:

深入解析Node.js中5种发起HTTP请求的方法



创建HTTP请求使现代编程语言的核心功能之一,也是很多程序员在接触到新的开发环境时最先遇到的技术之一。在Node.js中有相当多的解决方案,其中有语言内置功能,也有开源社区贡献的开发库。下面咱们来看一下比较流行的几种方式。

在本文的案例中,我们将使用NASA提供的“每日太空照片API”作为交互用的JSON API,

因为太空是有史以来最酷的东西。

在开始之前,请先在自己的计算机上安装最新版的node.js和npm。

HTTP - 标准库

首先是标准库中默认的HTTP模块。这个模块无需安装依赖外部即可使用,做到了真正的即插即用。缺点是与其他解决方案相比,用起来不是那么友好。

下面的代码将向NASA的API发送一个GET请求,并输出当天的天文照片的URL,以及它的注解:


 
 
  1. const https = require('https'); 
  2.   
  3. https.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', (resp) => { 
  4.   let data = ''
  5.   
  6.   // A chunk of data has been recieved. 
  7.   resp.on('data', (chunk) => { 
  8.     data += chunk; 
  9.   }); 
  10.   
  11.   // The whole response has been received. Print out the result. 
  12.   resp.on('end', () => { 
  13.     console.log(JSON.parse(data).explanation); 
  14.   }); 
  15.   
  16. }).on("error", (err) => { 
  17.   console.log("Error: " + err.message); 
  18. });  

HTTP和HTTPS模块提供的大多数功能是相当有限的。你需要以区块为单位接收响应数据,而不是只提供一个回调函数,以便在收到所有数据后就立即执行。如果它是JSON格式你还需要进行手动解析。尽管工作量不大,但是它仍然会带来一些不必要的操作。

另一个麻烦是,HTTP和HTTPS协议分属两个模块,因此如果我们使用的API是通过HTTPS协议进行通信,则需要HTTPS模块。

如果你不想向代码库中添加太多的依赖项或希望使用其底层的功能, 那么可能需要花费更多的精力来获取所需的数据, 尽管如此,但是它仍然是一个很好的工具。

Request

Request是一个简化的http客户端,它和Python的request库很像。这个库比默认的http 模块更好用,多年来被开源社区作为开发首选。

自从我开始使用Node.js就一直在用,他对快速完成开发任务很有帮助。与http 模块不同的是,你必须使用npm来安装它。

在终端下进入到你想要代码被下载的目录中,运行以下命令:


 
 
  1. npm install request@2.81.0 

可以看到,不需要写太多代码就能完成前面的功能:


 
 
  1. const request = require('request'); 
  2.   
  3. request('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', { json: true }, (err, res, body) => { 
  4.   if (err) { return console.log(err); } 
  5.   console.log(body.url); 
  6.   console.log(body.explanation); 
  7. });  

如果你想要一个使用正常方式处理HTTP请求的苦,那么Request是一个很好的选择。如果你想使用Promises,也可以签出request-promise库。

Axios

Axios是一个基于promise的HTTP客户端,可以用于浏览器和Node.js。在处理需要更复杂的事件链的代码时,使用Promises具有很大的优势。 编写异步代码可能会令人困惑,而Promises是这个问题的几种解决方案之一。 它们甚至被用在其它语言中,比如Swift。

使用npm安装Axios,在终端中输入以下命令:


 
 
  1. npm install axios@0.16.2 

下面的代码实现相同的功能,得到URL并解释当天的天文学图片。


 
 
  1. const axios = require('axios'); 
  2.   
  3. axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY'
  4.   .then(response => { 
  5.     console.log(response.data.url); 
  6.     console.log(response.data.explanation); 
  7.   }) 
  8.   .catch(error => { 
  9.     console.log(error); 
  10.   });  

默认情况下,Axios可以解析JSON响应,非常方便。你也可以看到错误处理是由.catch()完成的,现在我们都在使用 promises。

你甚至可以通过axios.all发起多个并发请求,比如说你想一次性得到两天的天文图片可以这样做:


 
 
  1. var axios = require('axios'); 
  2.   
  3. axios.all([ 
  4.   axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&date=2017-08-03'), 
  5.   axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&date=2017-08-02'
  6. ]).then(axios.spread((response1, response2) => { 
  7.   console.log(response1.data.url); 
  8.   console.log(response2.data.url); 
  9. })).catch(error => { 
  10.   console.log(error); 
  11. });  

异步代码很容易地变得十分复杂并且不容易处理, Axios很轻松的解决了这个问题,从长远看来可以使你的开发工作变得轻松。

SuperAgent

与Axios类似,SuperAgent 是另一个流行的库,主要用于浏览器中的Ajax请求,但也适用于Node.js。使用以下命令安装SuperAgent :


 
 
  1. npm install superagent@3.5.2 

SuperAgent最酷的地方是能进行链式调用,你可以把其它函数链到像query()这样的请求上,并且添加参数。在前面的例子中我们都是手动添加它们。请注意 SuperAgent 是怎样提供这种功能的:


 
 
  1. const superagent = require('superagent'); 
  2.   
  3. superagent.get('https://api.nasa.gov/planetary/apod'
  4. .query({ api_key: 'DEMO_KEY'date'2017-08-02' }) 
  5. .end((err, res) => { 
  6.   if (err) { return console.log(err); } 
  7.   console.log(res.body.url); 
  8.   console.log(res.body.explanation); 
  9. });  

和axios一样,你也不用自己解析去JSON响应,这非常酷。

Got

如果你想用一个更轻量级的库,Got是另外一个选择。它也可用于Twilio Functions。

再来一遍,实用npm安装Got:


 
 
  1. npm install got@7.1.0 

和Axios一样,Got也能同Promises一起很好的工作。下面的代码做的事情和前面的例子一样:


 
 
  1. const got = require('got'); 
  2.   
  3. got('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', { json: true }).then(response => { 
  4.   console.log(response.body.url); 
  5.   console.log(response.body.explanation); 
  6. }).catch(error => { 
  7.   console.log(error.response.body); 
  8. });  

如果你想要一个不像Request那样臃肿的轻量级的库,使用Got就对了。

最后的想法

以上并不是全部的解决方案,不过看到了这里,你知道了在Node.js中一些流行的HTTP库中的基本功能是怎样工作的。还有一些库,例如node-fetch将浏览器的获取(fetch)功能移植到后端。在其他语言中也有各种类似的库解决这个问题,比如 Python 和 Ruby 。


作者:疯狂的技术宅

来源:51CTO

相关文章
|
4月前
|
监控 负载均衡 JavaScript
有哪些有效的方法可以优化Node.js应用的性能?
有哪些有效的方法可以优化Node.js应用的性能?
241 69
|
3月前
|
JavaScript Linux 内存技术
Debian 11系统下Node.js版本更新方法详解
本指南详细介绍在Linux系统中安装和管理Node.js的步骤。首先检查现有环境,包括查看当前版本和清除旧版本;接着通过NodeSource仓库安装最新版Node.js并验证安装结果。推荐使用nvm(Node Version Manager)进行多版本管理,便于切换和设置默认版本。同时,提供常见问题解决方法,如权限错误处理和全局模块迁移方案,以及版本回滚操作,确保用户能够灵活应对不同需求。
224 0
|
3月前
|
JavaScript Linux 内存技术
Debian 11系统下Node.js版本更新方法
Debian 11更新Node.js主要就是这三种方式,无论你是初涉其中的新手还是找寻挑战的专家,总有一种方式能满足你的需求。现在,你已经是这个
260 80
|
3月前
|
JavaScript 前端开发 API
Node.js中发起HTTP请求的五种方式
以上五种方式,尽管只是冰山一角,但已经足以让编写Node.js HTTP请求的你,在连接世界的舞台上演奏出华丽的乐章。从原生的 `http`到现代的 `fetch`,每种方式都有独特的风格和表现力,让你的代码随着项目的节奏自由地舞动。
336 65
|
4月前
|
JavaScript 前端开发 开发者
Node学习笔记:HTTP模块
总的来说,Node.js的HTTP模块是一个强大的工具,可以帮助你处理HTTP协议的各种需求。无论你是想开设自己的餐厅(创建服务器),还是想去别的餐厅点菜(发出请求),HTTP模块都能满足你的需求。
115 18
|
5月前
|
JavaScript 前端开发 Java
js 垃圾回收机制的方法
JS回收机制方法讲解
|
6月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
519 29
|
6月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
165 4
|
6月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
6月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。