【Node核心模块HTTP】
環(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: 50003.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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Windows】Windows Res
- 下一篇: NPOI 导入Excel和读取Excel