日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Node核心模块HTTP】

發(fā)布時(shí)間:2025/5/22 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Node核心模块HTTP】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

環(huán)境:Node v8.2.1; Npm v5.3.0; OS Windows10
客戶端、服務(wù)端對(duì)我們都不陌生,Node.js 中的 HTTP 接口被設(shè)計(jì)成支持協(xié)議的許多特性。 比如,大塊編碼的消息。 這些接口不緩沖完整的請(qǐng)求或響應(yīng),用戶能夠以流的形式處理數(shù)據(jù)。

為了支持各種可能的 HTTP 應(yīng)用,Node.js 的 HTTP API 是非常底層的。 它只涉及流處理與消息解析。 它把一個(gè)消息解析成消息頭和消息主體,但不解析具體的消息頭或消息主體。

1、API結(jié)構(gòu)圖

由于該模塊中的內(nèi)容比較多,圖片我就分開傳了,避免一張圖密密麻麻的。

1.1 模塊類結(jié)構(gòu)圖

1.2 Agent類結(jié)構(gòu)圖

1.3 ClientRequest類結(jié)構(gòu)圖

1.4 Server 類結(jié)構(gòu)

1.5 ServerResponse類結(jié)構(gòu)圖

1.6 IncomingMessage類結(jié)構(gòu)圖

1.7 靜態(tài)方法和屬性圖

2、類關(guān)系

在看API之前,我還是簡(jiǎn)單的縷一縷上面幾個(gè)類的關(guān)系吧,從一個(gè)簡(jiǎn)單的例子開始

2.1 簡(jiǎn)單且核心的例子

const http = require("http"); //server const server = http.createServer((clientReq,serverRes)=>{serverRes.end(); }).listen(3000)//client const client=http.get("http://localhost:3000",(clientRes)=>{})

上面那么簡(jiǎn)單的幾行代碼已經(jīng)成功創(chuàng)建了一個(gè)server和一個(gè)client,看似簡(jiǎn)單,實(shí)際上卻不這樣,上面代碼以一共創(chuàng)建了4個(gè)實(shí)例,可以對(duì)照著頂部的那張圖看。

  • server:http.Server 類的實(shí)例,用來提供服務(wù),處理客戶端的請(qǐng)求。
  • client:http.ClientRequest 類的實(shí)例,用于向服務(wù)端發(fā)起請(qǐng)求
  • clientReq/clientRes:http.IncomingMessage 類的實(shí)例,【clientReq】用于服務(wù)端獲取客戶端請(qǐng)求的信息,【clientRes】用于客戶端獲取服務(wù)端返回的相關(guān)消息
  • serverRes:http.ServerResponse 類實(shí)例,用于服務(wù)端響應(yīng)客戶端請(qǐng)求

2.2 類關(guān)系圖

圖片有點(diǎn)亂,在畫圖本里面拖出來的,講究看吧,下面貼出繼承關(guān)系的源碼,只貼框架,里面具體的內(nèi)容就不貼了,貼出來感覺蠻亂的。

http.IncomingMessage 類繼承 stream.Readable:

export class IncomingMessage extends stream.Readable {}

http.ServerResponse 類繼承stream.Writable:

export class OutgoingMessage extends stream.Writable {}export class ServerResponse extends OutgoingMessage {}

3、一些例子

下面是部分API的例子,對(duì)部分API的一個(gè)簡(jiǎn)單代碼實(shí)現(xiàn)

3.1 server屬性

const http = require("http"); const server=http.createServer((ClientRequest,ServerResponse)=>{ServerResponse.end(); }) server.listen(3000); console.log("listening: "+server.listening); console.log("maxHeadersCount: "+server.maxHeadersCount); console.log("timeout: "+server.timeout); console.log("keepAliveTimeout: "+server.keepAliveTimeout);// listening: true // maxHeadersCount: null (沒有限制) // timeout: 120000 // keepAliveTimeout: 5000

3.2 server事件

const http = require("http");const server = http.createServer((ClientRequest, ServerResponse) => {ServerResponse.end(); }).listen(3000);server.on("request", (request, response) => {console.log("服務(wù)端收到請(qǐng)求"); })server.on("connection",socket=>{//超過默認(rèn)的5000msTCP流會(huì)被關(guān)閉,再次請(qǐng)求時(shí)會(huì)被重新建立console.log("一個(gè)新的 TCP 流被建立"); })

3.3 serverResponse屬性

const http = require("http"); const server = http.createServer((ClientRequest, ServerResponse) => {ServerResponse.writeHead(200, { 'Content-Type': 'text/plain'});ServerResponse.write("hello world");console.log("connection: "+ServerResponse.connection);console.log("finished: "+ServerResponse.finished);console.log("headersSent: "+ServerResponse.headersSent);console.log("sendDate: "+ServerResponse.sendDate);console.log("socket: "+ServerResponse.socket);console.log("statusCode: "+ServerResponse.statusCode);console.log("statusMessage: "+ServerResponse.statusMessage);ServerResponse.end();console.log("finished: "+ServerResponse.finished); }).listen(3000); /*connection: [object Object]finished: falseheadersSent: truesendDate: truesocket: [object Object]statusCode: 200statusMessage: OKfinished: true */

3.4 addTrailers()

const http = require("http"); const server = http.createServer((ClientRequest, ServerResponse) => {ServerResponse.writeHead(200, { 'Content-Type': 'text/plain' });ServerResponse.write("hello world");ServerResponse.addTrailers({'Content-MD5': '7895bf4b8828b55ceaf47747b4bca667'})ServerResponse.end(); }).listen(3000);

3.5 getHeader()

const http = require("http"); const server = http.createServer((ClientRequest, ServerResponse) => {ServerResponse.setHeader("foo","bar");ServerResponse.writeHead(200, { 'Content-Type': 'text/plain' });ServerResponse.write("hello world");console.log(ServerResponse.getHeader("foo"));ServerResponse.end(); }).listen(3000);

3.6 getHeaderNames()

const http = require("http"); const server = http.createServer((ClientRequest, ServerResponse) => {ServerResponse.setHeader("foo","bar");ServerResponse.writeHead(200, { 'Content-Type': 'text/plain' });ServerResponse.write("hello world");console.log(ServerResponse.getHeaderNames());//[ 'foo', 'content-type' ]ServerResponse.end(); }).listen(3000);

3.7 get()

const http = require("http"); const ClientRequest = http.get("http://localhost:3000", res => {res.setEncoding("utf8")let rawData = '';res.on("data", chunk => {rawData += chunk;})res.on("end", () => {console.log(rawData);}) }) ClientRequest.on("response", (imsg) => {console.log("收到響應(yīng)"); })

3.8 http.request

摘一個(gè)官方例子^_^

const postData = querystring.stringify({'msg' : 'Hello World!' });const options = {hostname: 'www.google.com',port: 80,path: '/upload',method: 'POST',headers: {'Content-Type': 'application/x-www-form-urlencoded','Content-Length': Buffer.byteLength(postData)} };const req = http.request(options, (res) => {console.log(`狀態(tài)碼: ${res.statusCode}`);console.log(`響應(yīng)頭: ${JSON.stringify(res.headers)}`);res.setEncoding('utf8');res.on('data', (chunk) => {console.log(`響應(yīng)主體: ${chunk}`);});res.on('end', () => {console.log('響應(yīng)中已無數(shù)據(jù)。');}); });req.on('error', (e) => {console.error(`請(qǐng)求遇到問題: ${e.message}`); });// 寫入數(shù)據(jù)到請(qǐng)求主體 req.write(postData); req.end();

總結(jié)

以上是生活随笔為你收集整理的【Node核心模块HTTP】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。