Node.js 有一个 内置的 HTTP 库 ,可以让您在没有外部模块的情况下发出 HTTP 请求。 唯一的缺点是 API 有点过时:它依赖于流,不支持 Promise。以下是如何发出 HTTP 请求 httpbin.org
使用 Nodejs 的 http
模块:
const http = require(http);
// `res` is an instance of Nodes 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()
。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
请登录后查看评论内容