在 Node.js 中发送 HTTP 请求
Node.js 有一个 内置的 HTTP 库 ,可以让您在没有外部模块的情况下发出 HTTP 请求。 唯一的缺点是 API 有点过时:它依赖于流,不支持 Promise。以下是如何发出 HTTP 请求 httpbin.org
使用 Nodejs 的 http
模块:
const http = require('http');
// `res` is an instance of Node's built-in `ServerResponse` class:
// https://nodejs.org/api/http.html#http_class_http_serverresponse
const res = await new Promise(resolve => {
http.get('http://httpbin.org/get?answer=42', resolve);
});
// A ServerResponse is a readable stream, so you need to use the
// stream-to-promise pattern to use it with async/await.
let data = await new Promise((resolve, reject) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('error', err => reject(err));
res.on('end', () => resolve(data));
});
data = JSON.parse(data);
data.args; // { answer: 42 }
您需要了解 Node 的 HTTP 库的一些细微差别:
- 它不支持
https://
网址。 你会得到一个Protocol "https:" not supported. Expected "http:"
如果你调用出错http.request()
带有 HTTPS URL。 你需要使用require('https').request()
反而。 http.request()
具有非标准 回调 签名:没有错误参数。 只是http.request(url, function callback(res) {})
,由于这个非标准的回调签名,你不能使用http.request()
与 _promisify()
功能 。
备择方案
由于 API 中存在这些粗糙的边缘,大多数开发人员不会使用 Node.js 的 HTTP 库来发出请求。 我们建议改用 Axios 。下面是如何使用 Axios 发出上述 HTTP 请求。
const axios = require('axios');
const res = await axios.get('https://httpbin.org/get?answer=42');
res.data.args; // { answer: 42 }
Axios 使 HTTP 请求比使用 Node.js 的内置库更干净。 另外由于 Axios 请求是 Promise,您可以 使用以下方法处理错误 catch()
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论