Node.js中的?http?模塊實(shí)戰(zhàn)舉例
Node.js 的 http 模塊是 Node.js 內(nèi)置的核心模塊之一,它允許開發(fā)者創(chuàng)建 HTTP 服務(wù)器和客戶端。通過這個模塊,我們可以輕松地處理 HTTP 請求和響應(yīng),構(gòu)建 Web 應(yīng)用程序或 API 服務(wù)。
http 模塊提供了創(chuàng)建服務(wù)器和發(fā)起 HTTP 請求的能力,是構(gòu)建 Web 應(yīng)用的基礎(chǔ)。它支持 HTTP/1.1 協(xié)議,并提供了豐富的 API 來處理各種 HTTP 相關(guān)的操作。
http 模塊是 Node.js 中的核心模塊之一,專門用于構(gòu)建基于 HTTP 的網(wǎng)絡(luò)應(yīng)用程序。它允許創(chuàng)建 HTTP 服務(wù)器和客戶端,處理網(wǎng)絡(luò)請求和響應(yīng)。
1. 核心 API 詳解
1.1. http.createServer([options][, requestListener])
用于創(chuàng)建 HTTP 服務(wù)器的核心方法,返回一個 http.Server 實(shí)例,可監(jiān)聽指定端口并處理請求。
- options(可選):用于提供服務(wù)器配置,允許指定 HTTP/1.1、HTTP/2 等協(xié)議。
- requestListener(可選):一個回調(diào)函數(shù),在每次接收到客戶端請求時調(diào)用。
const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, world!\n');
});
server.listen(3000, '127.0.0.1', () => {
console.log('Server running at http://127.0.0.1:3000/');
});- req:包含請求的詳細(xì)信息,比如 URL、HTTP 方法、請求頭等。
- res:用于響應(yīng)客戶端請求,可以設(shè)置狀態(tài)碼、響應(yīng)頭以及響應(yīng)體。
1.2.request and response Objects
1. http.IncomingMessage
表示服務(wù)器接收到的請求,是一個可讀流,用于獲取請求體和元數(shù)據(jù)。
常用屬性:
- req.method:請求的方法。
- req.url:請求的路徑和查詢參數(shù)。
- req.headers:請求的頭部信息。
2. http.ServerResponse
表示服務(wù)器對客戶端的響應(yīng),是一個可寫流,用于發(fā)送響應(yīng)數(shù)據(jù)。
常用方法:
- res.writeHead(statusCode[, headers]):設(shè)置狀態(tài)碼和頭部信息。
- res.end([data[, encoding]][, callback]):結(jié)束響應(yīng)并可以發(fā)送數(shù)據(jù)。
1.3. http.request(options[, callback])
用于創(chuàng)建 HTTP 客戶端請求。
const options = {
hostname: 'www.google.com',
port: 80,
path: '/',
method: 'GET',
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(data);
});
});
req.on('error', (e) => {
console.error(`Problem with request: ${e.message}`);
});
req.end();- options:用于配置請求的目標(biāo)、方法、頭信息等。
- callback:處理響應(yīng)的回調(diào)函數(shù)。
1.4.http.get(options[, callback])
這是一個簡化版的 http.request,專門用于 GET 請求,自動調(diào)用 req.end(),不需要顯式調(diào)用。
http.get('http://www.google.com', (res) => {
res.on('data', (chunk) => {
console.log(`Data chunk: ${chunk}`);
});
res.on('end', () => {
console.log('No more data.');
});
});2. 實(shí)戰(zhàn)項(xiàng)目:簡單的 HTTP 服務(wù)器與客戶端
創(chuàng)建一個簡單的 HTTP 服務(wù)器,它可以響應(yīng)客戶端的 GET 和 POST 請求。同時,通過客戶端請求獲取服務(wù)器上的數(shù)據(jù)。
2.1.創(chuàng)建 HTTP 服務(wù)器
在服務(wù)器端,接受 GET 和 POST 請求,并返回不同的響應(yīng)。
const http = require('http');
const server = http.createServer((req, res) => {
if (req.method === 'GET' && req.url === '/') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ message: 'Welcome to the GET request!' }));
} else if (req.method === 'POST' && req.url === '/submit') {
let body = '';
req.on('data', (chunk) => {
body += chunk.toString();
});
req.on('end', () => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ message: 'Data received!', data: body }));
});
} else {
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('404 Not Found');
}
});
server.listen(3000, () => {
console.log('Server listening on port 3000');
});2.2.創(chuàng)建 HTTP 客戶端
客戶端將發(fā)送 GET 和 POST 請求來與服務(wù)器進(jìn)行交互。
const http = require('http');
// Send GET request
http.get('http://localhost:3000', (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('GET Response:', data);
});
});
// Send POST request
const postData = JSON.stringify({ name: 'John', age: 30 });
const options = {
hostname: 'localhost',
port: 3000,
path: '/submit',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': postData.length,
},
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('POST Response:', data);
});
});
req.write(postData);
req.end();通過 http 模塊直接實(shí)現(xiàn) WebSocket (WS) 協(xié)議是一項(xiàng)深入底層協(xié)議的工作。WebSocket 是基于 TCP 的協(xié)議,在其通信過程中,依賴于 HTTP 協(xié)議的握手機(jī)制,但通信方式和 HTTP 不同,它允許建立一個長期的、雙向的連接。為了實(shí)現(xiàn) WebSocket 服務(wù)器,需要結(jié)合對 HTTP 和 WebSocket 握手機(jī)制、數(shù)據(jù)幀協(xié)議以及 TCP/IP 模型的理解。
到此這篇關(guān)于Node.js中的 http 模塊詳解的文章就介紹到這了,更多相關(guān)node.js http模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入了解 Node的多進(jìn)程服務(wù)實(shí)現(xiàn)
本文主要介紹了Node的多進(jìn)程服務(wù)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
NodeJS使用formidable實(shí)現(xiàn)文件上傳
這篇文章主要為大家詳細(xì)介紹了NodeJS使用formidable實(shí)現(xiàn)文件上傳的相關(guān)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10
node.js如何自定義實(shí)現(xiàn)一個EventEmitter
我們了解到,Node采用了事件驅(qū)動機(jī)制,而EventEmitter就是Node實(shí)現(xiàn)事件驅(qū)動的基礎(chǔ),本文主要介紹了node.js自定義實(shí)現(xiàn)EventEmitter,感興趣的可以了解一下2021-07-07
NodeJS通過魔術(shù)封包喚醒局域網(wǎng)計算機(jī)實(shí)例
這篇文章主要為大家介紹了NodeJS通過魔術(shù)封包喚醒局域網(wǎng)計算機(jī)代碼實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
node.js使用cluster實(shí)現(xiàn)多進(jìn)程
本文給大家詳細(xì)介紹了nodejs使用cluster模塊實(shí)現(xiàn)多進(jìn)程的方法和步奏,非常的細(xì)致全面,有需要的小伙伴可以參考下2016-03-03
使用Node.js配合Nginx實(shí)現(xiàn)高負(fù)載網(wǎng)絡(luò)
這篇文章主要介紹了使用Node.js配合Nginx實(shí)現(xiàn)高負(fù)載網(wǎng)絡(luò),Node的異步加上Nginx的反向代理在性能上實(shí)在是給力!需要的朋友可以參考下2015-06-06

