【Node核心模块HTTP】
生活随笔
收集整理的這篇文章主要介紹了
【Node核心模块HTTP】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
環(huán)境:Node v8.2.1; Npm v5.3.0; OS Windows10
客戶端、服務端對我們都不陌生,Node.js 中的 HTTP 接口被設計成支持協(xié)議的許多特性。 比如,大塊編碼的消息。 這些接口不緩沖完整的請求或響應,用戶能夠以流的形式處理數據。
為了支持各種可能的 HTTP 應用,Node.js 的 HTTP API 是非常底層的。 它只涉及流處理與消息解析。 它把一個消息解析成消息頭和消息主體,但不解析具體的消息頭或消息主體。
1、API結構圖
由于該模塊中的內容比較多,圖片我就分開傳了,避免一張圖密密麻麻的。
1.1 模塊類結構圖
1.2 Agent類結構圖
1.3 ClientRequest類結構圖
1.4 Server 類結構
1.5 ServerResponse類結構圖
1.6 IncomingMessage類結構圖
1.7 靜態(tài)方法和屬性圖
2、類關系
在看API之前,我還是簡單的縷一縷上面幾個類的關系吧,從一個簡單的例子開始
2.1 簡單且核心的例子
const http = require("http"); //server const server = http.createServer((clientReq,serverRes)=>{serverRes.end(); }).listen(3000)//client const client=http.get("http://localhost:3000",(clientRes)=>{})上面那么簡單的幾行代碼已經成功創(chuàng)建了一個server和一個client,看似簡單,實際上卻不這樣,上面代碼以一共創(chuàng)建了4個實例,可以對照著頂部的那張圖看。
- server:http.Server 類的實例,用來提供服務,處理客戶端的請求。
- client:http.ClientRequest 類的實例,用于向服務端發(fā)起請求
- clientReq/clientRes:http.IncomingMessage 類的實例,【clientReq】用于服務端獲取客戶端請求的信息,【clientRes】用于客戶端獲取服務端返回的相關消息
- serverRes:http.ServerResponse 類實例,用于服務端響應客戶端請求
2.2 類關系圖
圖片有點亂,在畫圖本里面拖出來的,講究看吧,下面貼出繼承關系的源碼,只貼框架,里面具體的內容就不貼了,貼出來感覺蠻亂的。
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的例子,對部分API的一個簡單代碼實現
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("服務端收到請求"); })server.on("connection",socket=>{//超過默認的5000msTCP流會被關閉,再次請求時會被重新建立console.log("一個新的 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("收到響應"); })3.8 http.request
摘一個官方例子^_^
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(`響應頭: ${JSON.stringify(res.headers)}`);res.setEncoding('utf8');res.on('data', (chunk) => {console.log(`響應主體: ${chunk}`);});res.on('end', () => {console.log('響應中已無數據。');}); });req.on('error', (e) => {console.error(`請求遇到問題: ${e.message}`); });// 寫入數據到請求主體 req.write(postData); req.end();總結
以上是生活随笔為你收集整理的【Node核心模块HTTP】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Windows】Windows Res
- 下一篇: NPOI 导入Excel和读取Excel