在Node.js中发出HTTP请求的7种方法

本文翻译自7 Ways to Make HTTP Requests in Node.js

HTTP请求是大多数现代语言的核心部分。 对于新开发人员而言,学习如何发出HTTP请求以交换数据可能是具有挑战性的。 幸运的是,对于Node.js开发人员而言并非如此。 有许多经过考验的解决方案可用于发出任何种类的HTTP请求。 让我们看一下一些支持HTTP请求的最受欢迎的Node.js库。

出于测试目的,我们将为所有示例使用JSONPlaceholder假的todo REST API。 我们的REST API返回以下JSON响应:

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

在继续之前,请确保已在计算机上安装了最新的LTS版本的Node.js和npm

1.HTTP —标准HTTP库

HTTPHTTPS模块都打包在标准库中。 使用这些模块,您可以轻松地发出HTTP请求,而无需安装外部软件包。 但是,不幸的是,这些是低级模块,与其他解决方案相比,它们不是很友好。

const https = require('https');

https.get('https://jsonplaceholder.typicode.com/todos/1', (response) => {
  let todo = '';

  // called when a data chunk is received.
  response.on('data', (chunk) => {
    todo += chunk;
  });

  // called when the complete response is received.
  response.on('end', () => {
    console.log(JSON.parse(todo).title);
  });

}).on("error", (error) => {
  console.log("Error: " + error.message);
});

注意
有关更多HTTPS模块示例,请查看教程中的本机Node.js发出HTTP请求

2.Request

Request是简化的HTTP客户端,与默认的HTTP模块相比,它更加用户友好。 它在社区中非常流行,并且被认为是Node.js项目的HTTP客户端。

HTTP模块不同,您需要使用以下命令从Node Package Manager(npm)将其安装为依赖项:

$ npm install request --save

以下是使用request HTTP客户端调用我们伪造的REST API的示例代码片段:

const request = require('request');

request('https://jsonplaceholder.typicode.com/todos/1', { json: true }, (err, res, body) => {
  if (err) { 
      return console.log(err); 
  }
  console.log(body.id);
  console.log(body.title);
});

注意:
有关更多请求模块示例,请参阅使用Request模块发出HTTP请求指南。

3.Needle

Needle是Node.js的可流HTTP客户端,它支持proxy, iconv, cookie, deflate and multi-part。 要从npm安装Needle,请在终端中运行以下命令:

$ npm install needle --save

以下代码段将执行调用伪造的REST API并打印详细信息的相同任务:

const needle = require('needle');

needle.get('https://jsonplaceholder.typicode.com/todos/1', {json: true}, (err, res) => {
    if (err) { 
          return console.log(err); 
      }
    let todo = res.body;
    console.log(todo.id);
    console.log(todo.title);
});

2.0.x版开始,Needle还支持Promises。 对于编写涉及一系列事件的更复杂的代码,Promises是很好的。 上面的代码片段可以使用Promises编写,如下所示:

const needle = require('needle');

needle('get', 'https://jsonplaceholder.typicode.com/todos/1', { json: true })
    .then(res => {
        let todo = res.body;
        console.log(todo.id);
        console.log(todo.title);
    }).catch(err => {
        console.log(err);
    });

您还可以在上面的代码片段中发现差异,因为我们现在正在使用Promises,所以使用.catch()进行错误处理。

注意:
有关更多Needle示例,请签出使用Needle进行HTTP请求教程。

4.Axios

Axios是用于浏览器和Node.js的基于Promise的HTTP客户端。 与上述HTTP客户端不同,Axios自动将响应数据转换为JSON对象。 在终端的项目根目录中运行以下命令:

$ npm install axios --save

由于它支持Promises,因此我们需要像上面对HTTP客户端所做的那样,编写更少的代码来调用伪造的REST API:

const axios = require('axios');

axios.get('https://jsonplaceholder.typicode.com/todos/1')
  .then(res => {
    console.log(res.data.id);
    console.log(res.data.title);
  })
  .catch(err => {
    console.log(err);
  });

Axios的另一个好处是,它通过axios.all支持多个并发请求。 例如,我们可以同时调用伪造的REST API来一次获取两个待办事项信息:

const axios = require('axios');

axios.all([
      axios.get('https://jsonplaceholder.typicode.com/todos/1'),
      axios.get('https://jsonplaceholder.typicode.com/todos/2')
    ]).then(axios.spread((res1, res2) => {
      console.log(res1.data.title);
      console.log(res2.data.title);
    })).catch(err => {
      console.log(err);
    });

有关更多Axios示例,请签出使用Axios进行HTTP请求教程。

5.SuperAgent

SuperAgent是另一个类似于Axios的流行HTTP库,用于在Node.js和浏览器中发出AJAX请求。 就像Axios一样,它会将响应数据解析为JSON,这非常酷。 使用以下命令从npm安装SuperAgent

$ npm install superagent --save

以下是使用SuperAgent调用伪造的REST API的代码段:

const superagent = require('superagent');

superagent.get('https://jsonplaceholder.typicode.com/todos/1')
.end((err, res) => {
  if (err) { 
      return console.log(err); 
  }
  console.log(res.body.id);
  console.log(res.body.title);
});

SuperAgent可通过插件高度扩展。 SuperAgent有许多插件可以执行不同的任务,例如不进行缓存,URL前缀和后缀等。您可以轻松编写自己的插件来扩展SuperAgent的功能。

6.Got

Got是Node.js的另一个用户友好的轻量级HTTP请求库。 使用以下命令从npm安装Got

$ npm install got --save

就像AxiosNeedle一样,Got也支持Promises`。 以下代码段将调用我们假的REST API以获取待办事项信息:

const got = require('got');

got('https://jsonplaceholder.typicode.com/todos/1', { json: true })
    .then(res => {
      console.log(res.body.id);
      console.log(res.body.title);
    }).catch(err => {
      console.log(err.response.body);
    });

7.Node-fetch

Node-fetch是一个轻量级的HTTP请求库,它将浏览器的Fetch API功能引入Node.js。 您可以在终端中使用以下命令从npm安装node-fetch

$ npm install node-fetch --save

Axios相似,最新的node-fetch版本支持Promises。 以下是调用我们的假REST API来使用Node-fetch模块获取待办事项信息的代码段:

const fetch = require('node-fetch');

fetch('https://jsonplaceholder.typicode.com/todos/1')
    .then(res => res.json()) // expecting a json response
    .then(json => {
        console.log(json.id);
        console.log(json.title);
    })
    .catch(err => {
        console.log(err);
    });

结论

这篇文章并不涵盖Node.js可用的所有HTTP请求库。 它仅说明HTTP功能在Node.js中某些最流行的HTTP客户端中如何工作。 Node.js还有许多其他HTTP客户端可用,例如simple-get,它提供了最简单的方法来发出HTTP请求,并支持少于100行的HTTPS,重定向和流。

您最喜欢在Node.js中发出HTTP请求的HTTP客户端是什么? 随时发推文,让我知道或提出任何其他问题。

喜欢这篇文章吗? 在TwitterLinkedIn上关注我。 您也可以订阅RSS Feed

上次更新时间:2020年2月16日

Node.js
Express.js

您可能还喜欢...

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352