Node.js進(jìn)行http/https請(qǐng)求和下載的實(shí)現(xiàn)實(shí)例
本文將介紹如何使用使用 Node.js 的 https 模塊和 fs 模塊實(shí)現(xiàn)了三個(gè) HTTP 請(qǐng)求的功能。分別展示了如何通過(guò) HTTPS 發(fā)起 GET 請(qǐng)求獲取 JSON 數(shù)據(jù)、發(fā)送帶有請(qǐng)求頭的 POST 請(qǐng)求,以及下載圖片并保存到本地。以下是對(duì)每個(gè)部分的詳細(xì)說(shuō)明。
1. 引入必要的模塊
const http = require("http"); // 用于發(fā)起HTTP請(qǐng)求
const https = require("https"); // 用于發(fā)起HTTPS請(qǐng)求
const fs = require("fs"); // 用于文件操作(如保存圖片)
- http模塊:Node.js內(nèi)置的一個(gè)核心模塊,可用于創(chuàng)建HTTP服務(wù)器或發(fā)起HTTP客戶端請(qǐng)求。
- https模塊:這是Node.js內(nèi)置的模塊,專(zhuān)門(mén)用于處理HTTPS協(xié)議的網(wǎng)絡(luò)請(qǐng)求。與http模塊相比,https模塊支持SSL/TLS加密,確保數(shù)據(jù)傳輸?shù)陌踩浴?/li>
- fs模塊:用于文件系統(tǒng)的操作,例如創(chuàng)建文件流以保存下載的圖片。
下面的代碼例子將使用 https 模塊發(fā)送請(qǐng)求,如需發(fā)送 http 請(qǐng)求,可將代碼中的 https 換成 http。
2. GET請(qǐng)求獲取JSON數(shù)據(jù)
功能描述
通過(guò)HTTPS發(fā)起一個(gè)GET請(qǐng)求,從jsonplaceholder.typicode.com/posts/5獲取指定ID的文章數(shù)據(jù),并將返回的JSON數(shù)據(jù)解析后輸出到控制臺(tái)。
核心代碼分析
const get_options = {
hostname: "jsonplaceholder.typicode.com", // 目標(biāo)服務(wù)器域名
port: 443, // HTTPS 默認(rèn)端口號(hào)為443 HTTP默認(rèn)端口號(hào)為80
path: "/posts/5", // 請(qǐng)求路徑,獲取 ID 為 5 的文章
method: "GET", // 請(qǐng)求方法
};
//創(chuàng)建請(qǐng)求
const get_req = https.request(get_options, (res) => {
let data = "";
res.on("data", (chunk) => {
data += chunk; // 將響應(yīng)數(shù)據(jù)片段拼接到變量中
});
res.on("end", () => {
const jsonData = JSON.parse(data); // 解析 JSON 數(shù)據(jù)
console.log(jsonData); // 輸出解析后的 JSON 對(duì)象
});
});
get_req.on("error", (error) => {
console.error(`Problem with request: ${error.message}`); // 處理請(qǐng)求錯(cuò)誤
});
get_req.end(); // 發(fā)送請(qǐng)求
參數(shù)說(shuō)明
- hostname: 指定目標(biāo)服務(wù)器的域名,這里是jsonplaceholder.typicode.com。
- port: HTTPS 協(xié)議默認(rèn)使用的端口是443。
- path: 請(qǐng)求的具體路徑,/posts/5表示獲取ID為5的文章。
- method: 請(qǐng)求方法,這里使用GET。
- https.request: 創(chuàng)建一個(gè)HTTPS請(qǐng)求對(duì)象。
- res.on('data', callback): 監(jiān)聽(tīng)響應(yīng)數(shù)據(jù)流,每次接收到數(shù)據(jù)片段時(shí)觸發(fā)回調(diào)函數(shù)。
- res.on('end', callback): 當(dāng)所有數(shù)據(jù)接收完畢時(shí)觸發(fā)回調(diào)函數(shù)。
- JSON.parse(data): 將接收到的字符串形式的JSON數(shù)據(jù)解析為JavaScript對(duì)象。
- get_req.end(): 發(fā)送請(qǐng)求, Node.js會(huì)開(kāi)始監(jiān)聽(tīng)服務(wù)器的響應(yīng),并依次觸發(fā)data、end等事件。
3. POST請(qǐng)求發(fā)送JSON數(shù)據(jù)
功能描述
構(gòu)造一個(gè)POST請(qǐng)求,向jsonplaceholder.typicode.com/posts發(fā)送JSON數(shù)據(jù)。展示了如何設(shè)置請(qǐng)求頭(如Content-Type和Content-Length),并將JSON數(shù)據(jù)作為請(qǐng)求體發(fā)送。
核心代碼分析
const post_options = {
hostname: "jsonplaceholder.typicode.com",
port: 443,
path: "/posts",
method: "POST",
Headers: { // 設(shè)置請(qǐng)求頭
"Content-Type": "application/json", // 指定請(qǐng)求體類(lèi)型為 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();
參數(shù)說(shuō)明
- Headers: 設(shè)置請(qǐng)求頭信息。
- Content-Type: 指定請(qǐng)求體的MIME類(lèi)型為application/json。
- Content-Length: 指定請(qǐng)求體的字節(jié)長(zhǎng)度,使用Buffer.byteLength計(jì)算。
- JSON.stringify: 將JavaScript對(duì)象序列化為JSON字符串。
- Buffer.byteLength: 計(jì)算字符串的字節(jié)長(zhǎng)度。
4. 下載圖片并保存到本地
功能描述
通過(guò)HTTPS發(fā)起一個(gè)GET請(qǐng)求,從cdn2.thecatapi.com/images/2OKotXbFe.jpg下載一張貓的圖片,并將其保存到本地文件系統(tǒng)。
核心代碼分析
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(); // 消耗響應(yīng)數(shù)據(jù)以釋放內(nèi)存
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();
參數(shù)說(shuō)明
- hostname: 圖片服務(wù)器的域名,這里是cdn2.thecatapi.com。
- path: 圖片資源的路徑,/images/2OKotXbFe.jpg。
- fs.createWriteStream(filePath): 創(chuàng)建一個(gè)可寫(xiě)流,用于將圖片數(shù)據(jù)保存到本地文件。
- res.pipe(fileStream): 將響應(yīng)數(shù)據(jù)管道傳輸?shù)轿募髦小?/li>
- fileStream.on('finish', callback): 當(dāng)文件寫(xiě)入完成時(shí)觸發(fā)回調(diào)函數(shù)。
- fileStream.close(callback): 關(guān)閉可寫(xiě)流,并觸發(fā)回調(diào)函數(shù)。
- res.resume(): 如果狀態(tài)碼不是200,消耗掉響應(yīng)數(shù)據(jù)以釋放內(nèi)存。
總結(jié)
本文詳細(xì)介紹了如何使用Node.js的https模塊發(fā)起不同類(lèi)型的HTTP請(qǐng)求,并通過(guò)一個(gè)完整代碼示例展示了如何實(shí)現(xiàn)以下功能:
- 使用GET請(qǐng)求獲取JSON數(shù)據(jù)。
- 構(gòu)造POST請(qǐng)求發(fā)送JSON數(shù)據(jù)。
- 下載圖片并保存到本地。
通過(guò)這些示例,讀者可以掌握https模塊的基本用法,并能夠根據(jù)實(shí)際需求擴(kuò)展功能。無(wú)論是開(kāi)發(fā)RESTful API客戶端還是實(shí)現(xiàn)文件下載工具,https模塊都是不可或缺的重要工具。
到此這篇關(guān)于Node.js進(jìn)行http/https請(qǐng)求和下載的實(shí)現(xiàn)實(shí)例的文章就介紹到這了,更多相關(guān)Node.js http/https請(qǐng)求和下載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你在heroku云平臺(tái)上部署Node.js應(yīng)用
heroku是構(gòu)建在AWS之上的一個(gè)PaaS云平臺(tái),現(xiàn)在支持Ruby, Node.js, Python, Java, 和 PHP,代碼的部署是通過(guò)git進(jìn)行,編譯和運(yùn)行都是自動(dòng)的。2014-07-07
NodeJS連接MySQL數(shù)據(jù)庫(kù)并進(jìn)行增刪改查操作詳解
本篇是使用NodeJS的模塊MySQL操作MySQL數(shù)據(jù)庫(kù)的基礎(chǔ)教程,連接MySQL數(shù)據(jù)庫(kù)并進(jìn)行增刪改查操作詳解,需要的朋友可以參考下2024-02-02
Windows下安裝Bun像Node或Deno的現(xiàn)代JS運(yùn)行時(shí)
這篇文章主要為大家介紹了一款像Node或Deno的現(xiàn)代JavaScript運(yùn)行時(shí)的bun在Windows下安裝過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
node.js中的http.response.end方法使用說(shuō)明
這篇文章主要介紹了node.js中的http.response.end方法使用說(shuō)明,本文介紹了http.response.end的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12
Node.js高級(jí)編程cluster環(huán)境及源碼調(diào)試詳解
這篇文章主要為大家介紹了Node.js高級(jí)編程cluster環(huán)境及源碼調(diào)試詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
koa2服務(wù)配置SSL的實(shí)現(xiàn)方法
這篇文章主要介紹了koa2服務(wù)配置SSL的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
Node.js讀寫(xiě)文件之批量替換圖片的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇Node.js讀寫(xiě)文件之批量替換圖片的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09

