详解在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 相关文章推荐
jQuery的实现原理的模拟代码 -1 核心部分
Aug 01 Javascript
jQuery实现原理的模拟代码 -6 代码下载
Aug 16 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
Mar 22 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
Sep 01 Javascript
Bootstrap 附加导航(Affix)插件实例详解
Jun 01 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
Feb 08 Javascript
详解打造 Vue.js 可复用组件
Mar 24 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
Mar 23 Javascript
p5.js临摹旋转爱心
Oct 23 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
Aug 07 Javascript
Vue中ref和$refs的介绍以及使用方法示例
Jan 11 Vue.js
原生JS实现分页
Apr 19 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中的foreach问题
2013/06/30 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
php基于socket实现SMTP发送邮件的方法
2015/03/05 PHP
PHP5.2中PDO的简单使用方法
2016/03/25 PHP
PHP简单预防sql注入的方法
2016/09/27 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
JavaScript Event事件学习第一章 Event介绍
2010/02/07 Javascript
javascript中万恶的function实例分析
2011/05/25 Javascript
javascript表单验证 - Parsley.js使用和配置
2013/01/25 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
2013/11/28 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
2014/05/07 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
JavaScript下拉菜单功能实例代码
2017/03/01 Javascript
几种响应式文字详解
2017/05/19 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
angularJS开发注意事项
2018/05/26 Javascript
前端防止用户重复提交js实现代码示例
2018/09/07 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
Python对字符串实现去重操作的方法示例
2017/08/11 Python
利用python将json数据转换为csv格式的方法
2018/03/22 Python
Python3 JSON编码解码方法详解
2019/09/06 Python
python filecmp.dircmp实现递归比对两个目录的方法
2020/05/22 Python
什么是python的必选参数
2020/06/21 Python
Python unittest如何生成HTMLTestRunner模块
2020/09/08 Python
介绍CSS3使用技巧5个
2009/04/02 HTML / CSS
使用HTML5 Canvas API绘制弧线的教程
2016/03/22 HTML / CSS
Parfumdreams英国:香水和化妆品
2019/05/10 全球购物
Perfume’s Club英国官网:购买香水和护肤品
2019/11/02 全球购物
Ariat英国官网:为世界顶级马术运动员制造最优质的鞋类和服装
2020/02/14 全球购物
Linux操作面试题
2012/05/16 面试题
工业设计专业自荐书
2014/06/05 职场文书
信用卡工资证明范本
2014/10/17 职场文书
生死牛玉儒观后感
2015/06/11 职场文书
TypeScript 使用 Tuple Union 声明函数重载
2022/04/07 Javascript
Vue Element plus使用方法梳理
2022/12/24 Vue.js