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

翻译:疯狂的技术宅 英文标题:5 Ways to Make HTTP Requests in Node.js 原文链接:www.twilio.com/blog/2017/0…

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

在本文的案例中,我们将使用NASA提供的“每日太空照片API”作为交互用的JSON API, 因为太空是有史以来最酷的东西。

在开始之前,请先在自己的计算机上安装最新版的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);
});
复制代码

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

另一个麻烦是,HTTPHTTPS协议分属两个模块,因此如果我们使用的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 。

原文首发于公众号:京程一灯

原文地址: mp.weixin.qq.com/s/pDhS4G8U7…

在Node.js中发起HTTP请求的5种方法相关推荐

  1. Node.js模拟发起http请求从异步转同步的5种方法

    使用Node.js模拟发起http请求很常用的,但是由于Node模块(原生和第三方库)提供里面的方法都是异步,对于很多场景下应用很麻烦,不如同步来的方便.下面总结了几个常见的库API从异步转同步的几种 ...

  2. html中vue数据请求的三种方法

    1.resource Vue 要实现异步加载需要使用到 vue-resource 库. Vue.js 2.0 版本推荐使用 axios 来完成 ajax 请求. 先导入一个线上cdn的地址,也可以去n ...

  3. 模拟发起http请求的几种方法

    如何使用http协议调用服务器端的服务. 在日常工作中很多时候我们会需要测试自己提供出来的方法, 很多时候一些方法跨平台提供给第三方使用,一般与服务器通信协议都选择http协议, 建议可以去仔细学习一 ...

  4. node.js中使用https请求报CERT_UNTRUSTED的问题解决

    只要调用了没有受信的https就会报错:CERT_UNTRUSTED 简单的解决方法就是设置环境变量回避非授信证书的问题. 只要在请求的代码之前加上如下代码即可: process.env.NODE_T ...

  5. node.js 中Mysql 查询报错 ,解决方法。

    1.报错: throw err; // Rethrow non-MySQL errors 2.问题出处 mysql\lib\protocol\Parser.js:437 抛出异样,try..catch ...

  6. 前端使用js发起http请求的几种方法

    通用的一些流程 要判断http返回码 要判断body里面业务返回码 是否能够跨域 是否能够携带Cookie 常用的方法有fetch, ajax, axios, XMLHttpRequest,reque ...

  7. Node.js中LTS和Current的两种版本有啥区别?

    LTS是Long Time Support,长期支持的意思. LTS:长期支持版,稳定 Current:最新版

  8. 面试题31:JS中判断是数组的四种方法

    目录 第一种:Array.isArray 第二种:instanceof 第三种:通过constructor判断 instanceof和constructor的判定也存在一些弊端 第四种:通过Objec ...

  9. JS中阻止冒泡事件的三种方法

    冒泡事件:比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发.这一过程被称为事件冒泡. <div class="box"><button c ...

  10. js中设置元素class的三种方法小结

    一.el.setAttribute('class','abc'); 复制代码 代码如下: <!DOCTYPE HTML> <HTML> <HEAD> <met ...

最新文章

  1. 项目经理修炼手册 2.1.2 项目经理的基本功
  2. 流数据机器学习平台SAMOA简介
  3. JPA关系映射之one-to-many和many-to-one
  4. php数组排序面试题,PHP按子数组值对数组排序
  5. MybatisPlus 多租户架构(Multi-tenancy)实现
  6. 在 NetBeans IDE 中设计 Swing GUI
  7. cacti+nagios 整合遇到的问题
  8. 基于 CNN 的中文对话情感分析
  9. 图结构练习——最小生成树
  10. mysql主从复制故障处理_MySQL主从复制故障处理一例
  11. 《完美软件》读书笔记9:良好测试的要素
  12. iOS 离屏渲染的研究
  13. 牛客网--华为机试在线训练10:字符个数统计
  14. 在Linux 中如何从进程相关的文件描述中恢复数据
  15. elasticsearch索引模块缓存
  16. 解决办法:java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_eye(III)J
  17. 如何更改Dropbox的同步文件夹?
  18. 访问不到webapp
  19. 无线覆盖商场微信吸粉解决方案
  20. 对物质导数与拉格朗日视角、欧拉视角之间的关系的粗浅理解

热门文章

  1. Ubutu: mysql + jdk + tomcat installation
  2. SilverLight企业应用框架设计【一】整体说明
  3. DB2 开发系列 从入门开始--概述
  4. Ford-Fulkerson Edmonds-Karp算法
  5. Dato for mac(自定义菜单栏日历)支持m1
  6. VirtualBox 安装 win11 虚拟机
  7. Java线程池自学手册Executor的使用
  8. 轻松应对多层JSON数据计算与入库
  9. 关于本地缓存localstorage与sessionStorage 数组 (array)字符串(string) 对象(object)的存储技巧和注意事项...
  10. 百度地图API画多边型,测面积