详解在Node.js中发起HTTP请求的5种方法


Posted in Javascript onJanuary 10, 2019

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

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

HTTP - 标准库

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

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

const https = require('https');
 
https.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', (resp) => {
 let data = '';
 
 // A chunk of data has been recieved.
 resp.on('data', (chunk) => {
  data += chunk;
 });
 
 // The whole response has been received. Print out the result.
 resp.on('end', () => {
  console.log(JSON.parse(data).explanation);
 });
 
}).on("error", (err) => {
 console.log("Error: " + err.message);
});

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

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

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

Request

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

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

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

npm install request@2.81.0

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

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

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

Axios

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

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

npm install axios@0.16.2

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

const axios = require('axios');
 
axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY')
 .then(response => {
  console.log(response.data.url);
  console.log(response.data.explanation);
 })
 .catch(error => {
  console.log(error);
 });

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

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

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

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

SuperAgent

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

npm install superagent@3.5.2

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

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

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

Got

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

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

npm install got@7.1.0

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

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

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

最后的想法

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

5 Ways to Make HTTP Requests in Node.js 原文链接:https://www.twilio.com/blog/2017/08/http-requests-in-node-js.html

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用javascript实现计算两个日期的间隔天数
Aug 14 Javascript
js 获取class的元素的方法 以及创建方法getElementsByClassName
Mar 11 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
Jun 16 Javascript
js 动态修改css文件的方法
Aug 05 Javascript
node.js微信公众平台开发教程
Mar 04 Javascript
Bootstrap开发实战之响应式轮播图
Jun 02 Javascript
js删除Array数组中指定元素的两种方法
Aug 03 Javascript
详解AngularJS1.x学习directive 中‘& ’‘=’ ‘@’符号的区别使用
Aug 23 Javascript
用npm安装vue和vue-cli,并使用webpack创建项目的方法
Sep 28 Javascript
ES6 let和const定义变量与常量的应用实例分析
Jun 27 Javascript
vue实现点击按钮“查看详情”弹窗展示详情列表操作
Sep 09 Javascript
JavaScript 中的六种循环方法
Jan 06 Javascript
vue实现压缩图片预览并上传功能(promise封装)
Jan 10 #Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
Jan 10 #Javascript
最简单的JS实现json转csv的方法
Jan 10 #Javascript
puppeteer实现html截图的示例代码
Jan 10 #Javascript
其实你可以少写点if else与switch(推荐)
Jan 10 #Javascript
微信小程序提取公用函数到util.js及使用方法示例
Jan 10 #Javascript
浅谈JavaScript 代码简洁之道
Jan 09 #Javascript
You might like
php数据结构与算法(PHP描述) 快速排序 quick sort
2012/06/21 PHP
解析获取优酷视频真实下载地址的PHP源代码
2013/06/26 PHP
destoon实现首页显示供应、企业、资讯条数的方法
2014/07/15 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
PHP输出Excel PHPExcel的方法
2018/07/26 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
一个JS翻页效果
2007/07/23 Javascript
js 页面传参数时 参数值含特殊字符的问题
2009/12/13 Javascript
javascript设计模式 接口介绍
2012/07/24 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
2015/03/18 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
javascript禁止访客复制网页内容的实现代码
2015/08/05 Javascript
如何用jQuery实现ASP.NET GridView折叠伸展效果
2015/09/26 Javascript
jquery实现简单Tab切换菜单效果
2020/07/17 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
一个简单的JavaScript Map实例(分享)
2016/08/03 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
2016/08/24 Javascript
第一次接触神奇的前端框架vue.js
2016/12/01 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
jQuery.Ajax()的data参数类型详解
2017/07/23 jQuery
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
详解vue中使用vue-quill-editor富文本小结(图片上传)
2019/04/24 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
Python实现简单多线程任务队列
2016/02/27 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
python如何制作缩略图
2019/04/30 Python
Django框架自定义session处理操作示例
2019/05/27 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
python matplotlib 绘图 和 dpi对应关系详解
2020/03/14 Python
Python持续监听文件变化代码实例
2020/07/22 Python
夜大毕业生自我鉴定
2013/10/31 职场文书
党员干部承诺书范文
2014/03/25 职场文书
志愿者活动总结
2014/04/28 职场文书
演讲稿的写法
2014/05/19 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书
详解SQL的窗口函数
2022/04/21 Oracle