Node.js进行http/https请求和下载的实现实例
作者:卿·静
本文将介绍如何使用使用 Node.js 的 https 模块和 fs 模块实现了三个 HTTP 请求的功能。分别展示了如何通过 HTTPS 发起 GET 请求获取 JSON 数据、发送带有请求头的 POST 请求,以及下载图片并保存到本地。以下是对每个部分的详细说明。
1. 引入必要的模块
const http = require("http"); // 用于发起HTTP请求
const https = require("https"); // 用于发起HTTPS请求
const fs = require("fs"); // 用于文件操作(如保存图片)
- http模块:Node.js内置的一个核心模块,可用于创建HTTP服务器或发起HTTP客户端请求。
- https模块:这是Node.js内置的模块,专门用于处理HTTPS协议的网络请求。与http模块相比,https模块支持SSL/TLS加密,确保数据传输的安全性。
- fs模块:用于文件系统的操作,例如创建文件流以保存下载的图片。
下面的代码例子将使用 https 模块发送请求,如需发送 http 请求,可将代码中的 https 换成 http。
2. GET请求获取JSON数据
功能描述
通过HTTPS发起一个GET请求,从jsonplaceholder.typicode.com/posts/5获取指定ID的文章数据,并将返回的JSON数据解析后输出到控制台。
核心代码分析
const get_options = {
hostname: "jsonplaceholder.typicode.com", // 目标服务器域名
port: 443, // HTTPS 默认端口号为443 HTTP默认端口号为80
path: "/posts/5", // 请求路径,获取 ID 为 5 的文章
method: "GET", // 请求方法
};
//创建请求
const get_req = https.request(get_options, (res) => {
let data = "";
res.on("data", (chunk) => {
data += chunk; // 将响应数据片段拼接到变量中
});
res.on("end", () => {
const jsonData = JSON.parse(data); // 解析 JSON 数据
console.log(jsonData); // 输出解析后的 JSON 对象
});
});
get_req.on("error", (error) => {
console.error(`Problem with request: ${error.message}`); // 处理请求错误
});
get_req.end(); // 发送请求
参数说明
- hostname: 指定目标服务器的域名,这里是jsonplaceholder.typicode.com。
- port: HTTPS 协议默认使用的端口是443。
- path: 请求的具体路径,/posts/5表示获取ID为5的文章。
- method: 请求方法,这里使用GET。
- https.request: 创建一个HTTPS请求对象。
- res.on('data', callback): 监听响应数据流,每次接收到数据片段时触发回调函数。
- res.on('end', callback): 当所有数据接收完毕时触发回调函数。
- JSON.parse(data): 将接收到的字符串形式的JSON数据解析为JavaScript对象。
- get_req.end(): 发送请求, Node.js会开始监听服务器的响应,并依次触发data、end等事件。
3. POST请求发送JSON数据
功能描述
构造一个POST请求,向jsonplaceholder.typicode.com/posts发送JSON数据。展示了如何设置请求头(如Content-Type和Content-Length),并将JSON数据作为请求体发送。
核心代码分析
const post_options = {
hostname: "jsonplaceholder.typicode.com",
port: 443,
path: "/posts",
method: "POST",
Headers: { // 设置请求头
"Content-Type": "application/json", // 指定请求体类型为 JSON
"Content-Length": Buffer.byteLength(
JSON.stringify({
userId: 1,
title: "hello world",
body: "你好",
})
),
},
};
const post_req = https.request(post_options, (res) => {
let data = "";
res.on("data", (chunk) => {
data += chunk;
});
res.on("end", () => {
const jsonData = JSON.parse(data);
console.log(jsonData);
});
});
post_req.on("error", (error) => {
console.error(`Problem with request: ${error.message}`);
});
post_req.end();
参数说明
- Headers: 设置请求头信息。
- Content-Type: 指定请求体的MIME类型为application/json。
- Content-Length: 指定请求体的字节长度,使用Buffer.byteLength计算。
- JSON.stringify: 将JavaScript对象序列化为JSON字符串。
- Buffer.byteLength: 计算字符串的字节长度。
4. 下载图片并保存到本地
功能描述
通过HTTPS发起一个GET请求,从cdn2.thecatapi.com/images/2OKotXbFe.jpg下载一张猫的图片,并将其保存到本地文件系统。
核心代码分析
const img_options = {
hostname: "cdn2.thecatapi.com",
port: 443,
path: "/images/2OKotXbFe.jpg",
method: "GET",
};
const img_req = https
.request(img_options, (res) => {
if (res.statusCode !== 200) {
console.error(`Failed to fetch image, status code: ${res.statusCode}`);
res.resume(); // 消耗响应数据以释放内存
return;
}
const filePath = "./cat_image.jpg";
const fileStream = fs.createWriteStream(filePath);
res.pipe(fileStream);
fileStream.on("finish", () => {
fileStream.close(() => {
console.log("Image saved successfully.");
});
});
})
.on("error", (err) => {
console.error(`Error downloading image: ${err.message}`);
});
img_req.end();
参数说明
- hostname: 图片服务器的域名,这里是cdn2.thecatapi.com。
- path: 图片资源的路径,/images/2OKotXbFe.jpg。
- fs.createWriteStream(filePath): 创建一个可写流,用于将图片数据保存到本地文件。
- res.pipe(fileStream): 将响应数据管道传输到文件流中。
- fileStream.on('finish', callback): 当文件写入完成时触发回调函数。
- fileStream.close(callback): 关闭可写流,并触发回调函数。
- res.resume(): 如果状态码不是200,消耗掉响应数据以释放内存。
总结
本文详细介绍了如何使用Node.js的https模块发起不同类型的HTTP请求,并通过一个完整代码示例展示了如何实现以下功能:
- 使用GET请求获取JSON数据。
- 构造POST请求发送JSON数据。
- 下载图片并保存到本地。
通过这些示例,读者可以掌握https模块的基本用法,并能够根据实际需求扩展功能。无论是开发RESTful API客户端还是实现文件下载工具,https模块都是不可或缺的重要工具。
到此这篇关于Node.js进行http/https请求和下载的实现实例的文章就介绍到这了,更多相关Node.js http/https请求和下载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
