本文翻译自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库
HTTP
和HTTPS
模块都打包在标准库中。 使用这些模块,您可以轻松地发出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
就像Axios
和Needle
一样,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客户端是什么? 随时发推文,让我知道或提出任何其他问题。
喜欢这篇文章吗? 在Twitter和LinkedIn上关注我。 您也可以订阅RSS Feed。
上次更新时间:2020年2月16日
Node.js
Express.js
网友评论