更新時(shí)間:2021-12-01 來源:黑馬程序員 瀏覽量:
HTTP服務(wù)器本質(zhì)上也是一個(gè)Socket服務(wù)器,可以理解為在Socket服務(wù)器的基礎(chǔ)上進(jìn)行了一些封裝,簡化了一些操作。本節(jié)將對(duì)HTTP模塊提供的API進(jìn)行詳細(xì)介紹。
1. http.Server
在Node.js中,HTTP服務(wù)器是指http.Server對(duì)象,用Node.js做的所有基于HTTP協(xié)議的系統(tǒng),如網(wǎng)站、社交應(yīng)用甚至代理服務(wù)器,都是基于http.Server實(shí)現(xiàn)的。它提供了一套封裝級(jí)別很低的API,僅僅是流控制和簡單的消息解析,所有的高層功能都要通過它的接口來實(shí)現(xiàn)。創(chuàng)建http.Server對(duì)象的語法如下:
Var server = http.createServer();
在上述代碼中,使用creatServer()函數(shù)創(chuàng)建的server對(duì)象就是一個(gè)http.Server對(duì)象。
http.Server是一個(gè)基于事件的HTTP服務(wù)器,繼承自EventEmitter,所有的請(qǐng)求都被封裝為獨(dú)立的事件,開發(fā)者只需要對(duì)它的事件編寫相應(yīng)函數(shù)即可實(shí)現(xiàn)HTTP服務(wù)器的所有功能。http.Server提供了一些函數(shù),具體如下:
(1)server.close([callback]):服務(wù)器停止已經(jīng)開始的監(jiān)聽。
(2) server.listen(port[, hostname][, backlog][, callback])。
server.listen參數(shù)說明如下:
●port:指定監(jiān)聽的端口。
● hostname:指定主機(jī)名。
●backlog:指定被允許進(jìn)行排隊(duì)的最大待處理連接數(shù),默認(rèn)是511。
●callback:指定該服務(wù)器已經(jīng)開始在指定的端口上監(jiān)聽時(shí),要執(zhí)行的回調(diào)處理函數(shù)。
(3))server listen(handle[,callback])和server.listen(path[,callback]):監(jiān)聽文件系統(tǒng)的連接。第一個(gè)是監(jiān)聽已打開文件描述句柄,第二個(gè)是要監(jiān)聽一個(gè)文件的路徑。除此之外,http.Server 還提供了3個(gè)事件,具體如下:
(1)request:當(dāng)客戶端請(qǐng)求到來時(shí),該事件被觸發(fā),提供兩個(gè)參數(shù)req和res,分別為http.ServerRequest和http.ServerResponse的實(shí)例,表示請(qǐng)求和響應(yīng)信息。
(2)connection:當(dāng)TCP連接建立時(shí),該事件被觸發(fā),提供一個(gè)參數(shù)socket,為net.Socket 的實(shí)例。connection事件的粒度要大于request,因?yàn)榭蛻舳嗽贙eep-Alive模式下可能會(huì)在同一個(gè)連接內(nèi)發(fā)送多次請(qǐng)求。
(3)close:當(dāng)服務(wù)器關(guān)閉時(shí),該事件被觸發(fā)。注意不是在用戶連接斷開時(shí)。除此之外,還有checkContinue、upgrade、clientError事件,通常不需要關(guān)心,只有在實(shí)現(xiàn)復(fù)雜的HTTP服務(wù)器時(shí)才會(huì)用到。
2. http.IncomingMessage 對(duì)象
在HTTP 服務(wù)器和客戶端都會(huì)創(chuàng)建http.IncomingMessage對(duì)象,它一般由http.Server的request事件發(fā)送,作為第一個(gè)參數(shù)傳遞,通常簡稱為request或req。在發(fā)送HTTP 請(qǐng)求時(shí),會(huì)發(fā)送請(qǐng)求報(bào)文,http.IncomingMessage對(duì)象實(shí)現(xiàn)了一個(gè)可讀流,在服務(wù)器端,http.IncomingMessage 提供了一個(gè)close 事件,用戶當(dāng)前請(qǐng)求結(jié)束時(shí),也就是底層的套接字被關(guān)閉時(shí)該事件被觸發(fā)。另外,http.IncomingMessage對(duì)象中還提供了一些函數(shù)和屬性,用來獲取客戶端請(qǐng)求和服務(wù)器端響應(yīng)的一些信息,如下表所示。
表7-2 http.IncomingMessage 對(duì)象的常用函數(shù)和屬性
函數(shù)&屬性 | 說明 |
message.headers | 包含了隨請(qǐng)求/回應(yīng)發(fā)送的標(biāo)頭的一個(gè)對(duì)象 |
message.httpVersion | 指定用于構(gòu)建客戶端請(qǐng)求/響應(yīng)的HTTP版本 |
message.setTimeout(msccs, callback) | 設(shè)置連接的以毫秒為單位的套接字超時(shí)時(shí)間,連同一個(gè)如果發(fā)生超時(shí)時(shí)被執(zhí)行的回調(diào)函數(shù) |
message.method | 指定用于請(qǐng)求/響應(yīng)的方法 |
message. statusCode | 指定來自服務(wù)器的3位數(shù)狀態(tài)碼。此屬性只在處理服務(wù)器響應(yīng)的HTTP客戶端上有效 |
message.socket | 這是一個(gè)指向net.Socket對(duì)象的句柄,用來與客戶端/服務(wù)器通信 |
message.url | 發(fā)送到服務(wù)器的URL字符串,只在處理服務(wù)器中有效 |
3. http.ServerResponse
htp.ServerResponse是返回給客戶端的信息,決定了用戶最終能看到的結(jié)果。它也是由http.Server的request事件發(fā)送的,作為第二個(gè)參數(shù)傳遞,一般簡稱為response或res。
http.ServerResponse是一個(gè)可寫流,用來給客戶端的Socket發(fā)送響應(yīng)報(bào)文,在服務(wù)器做出響應(yīng)之前會(huì)發(fā)送響應(yīng)報(bào)文,http.ServerResponse中有3個(gè)重要的成員函數(shù),前兩個(gè)用于返回對(duì)應(yīng)響應(yīng)報(bào)文的響應(yīng)頭和響應(yīng)內(nèi)容,最后一個(gè)用于結(jié)束請(qǐng)求,具體如下:
(1)response.writeHead(statusCode,[headers]):向請(qǐng)求的客戶端發(fā)送響應(yīng)頭。status-Code是HTTP狀態(tài)碼,如200(請(qǐng)求成功)、404(未找到)等。headers是一個(gè)類似關(guān)聯(lián)數(shù)組的對(duì)象,表示響應(yīng)頭的每個(gè)屬性。該函數(shù)在一個(gè)請(qǐng)求內(nèi)最多只能調(diào)用一次,如果不調(diào)用,則會(huì)自動(dòng)生成一個(gè)響應(yīng)頭。
(2)response.write(data,[encoding]):向請(qǐng)求的客戶端發(fā)送響應(yīng)內(nèi)容。data是一個(gè)Buffer或字符串,表示要發(fā)送的內(nèi)容。如果data是字符串,那么需要指定encoding來說明它的編碼方式,默認(rèn)是utf-8。在response.end 調(diào)用之前,response.write可以被多次調(diào)用。
(3)response.end([data],[encoding]):結(jié)束響應(yīng),告知客戶端所有發(fā)送已經(jīng)完成。當(dāng)所有返回的內(nèi)容發(fā)送完畢時(shí),該函數(shù)必須被調(diào)用一次。它接收兩個(gè)可選參數(shù),意義和response.write相同。如果不調(diào)用該函數(shù),客戶端將永遠(yuǎn)處于等待狀態(tài)。除上述成員函數(shù)外,還有一些函數(shù)和屬性可供開發(fā)者使用,如表7-3所示。
表7-3 http.ServerResponse其他函數(shù)和屬性
函數(shù)&屬性 | 說明 |
response.add Trailers(headers) | 將HTTP尾隨標(biāo)頭寫人響應(yīng)的結(jié)束處 |
response.finished | 默認(rèn)為false,調(diào)用end)的數(shù)方法后結(jié)果為 true |
response.getHeader(name) | 獲取已在響應(yīng)中設(shè)置的HTTP標(biāo)頭的值 |
response.headersSent | 如果標(biāo)頭已被發(fā)送,為true;否則為false |
response.removeHeader(name) | 移除已在響應(yīng)中設(shè)置的一個(gè)HTTP標(biāo)頭 |
response.sendDate | 如果設(shè)置為true,則Data標(biāo)頭的是自動(dòng)生成的,并作為響應(yīng)的一部分發(fā)送 |
response.setHeader(name, value) | 設(shè)置一個(gè)特定的標(biāo)頭值 |
response.setTimeout(msecs, callback) | 設(shè)置客戶端連接的套接字超時(shí)時(shí)間,以毫秒計(jì),帶有一個(gè)如果發(fā)生超時(shí)將被執(zhí)行的回調(diào)函數(shù) |
response.statusCode | 無須顯式地寫入標(biāo)頭來指定響應(yīng)狀態(tài)碼 |
response.statusMessage | 當(dāng)使用隱式消息頭并且游息頭被刷新時(shí),這個(gè)屬性控制的消息狀態(tài)將被發(fā)送到客戶端 |
response.writeContinueO | 發(fā)送一個(gè)HTTP/1.1100繼續(xù)消息給客戶端,表示請(qǐng)求主體應(yīng)該發(fā)送 |
Web API是干什么的?Web API與API的關(guān)系