-
概要
http模塊包含了一個(gè)高效的http服務(wù)器和一個(gè)簡(jiǎn)易的http客戶端裳扯。
http.Server 是一個(gè)基于事件的HTTP服務(wù)器,它的核心由C++部分實(shí)現(xiàn)莽鸿,接口由JavaScript封裝椎例。
http.request 是一個(gè)HTTP客戶端工具劳翰,用于向Http服務(wù)器發(fā)起請(qǐng)求链蕊。
-
HTTP服務(wù)器
http.Server是http模塊中的HTTP服務(wù)器對(duì)象事甜,用Node.js做的所有基于HTTP協(xié)議的系統(tǒng),都是基于this滔韵。
它提供了一套封裝級(jí)別很低的API逻谦,僅僅是流控制和簡(jiǎn)單的消息解析,所有的高層功能都要通過(guò)它的接口來(lái)實(shí)現(xiàn)奏属。
-
http.Server
http.Server是一個(gè)基于事件的 HTTP 服務(wù)器跨跨,所有的請(qǐng)求都被封裝為獨(dú)立的事件潮峦, 開(kāi)發(fā)者只需要對(duì)它的事件編寫響應(yīng)函數(shù)即可實(shí)現(xiàn) HTTP 服務(wù)器的所有功能囱皿。
它繼承自 EventEmitter,提供了以下幾個(gè)事件忱嘹。
- request:當(dāng)客戶請(qǐng)求到來(lái)時(shí)嘱腥,該事件被觸發(fā),提供兩個(gè)參數(shù)req(httpServerRequest)和res(http.ServerResponse)的實(shí)例拘悦,表示請(qǐng)求和響應(yīng)信息齿兔。
- connection:當(dāng)TCP連接建立時(shí)被觸發(fā),提供一個(gè)參數(shù)socket础米,是net.Socket的實(shí)例分苇。
- close:當(dāng)服務(wù)器關(guān)閉時(shí)被觸發(fā)。(注:不是用戶鏈接斷開(kāi)時(shí)觸發(fā))
由于request經(jīng)常使用梧疲,因此http封裝了一個(gè)方法:
http.createServer([requestListener]),功能是創(chuàng)建一個(gè)HTTP服務(wù)器并將requestListener作為request時(shí)間的監(jiān)聽(tīng)函數(shù)蟹漓。
-
http.ServerRequest
http.ServerRequest 是HTTP請(qǐng)求的信息巡揍。
一般由http.Server的request事件發(fā)送,作為第一個(gè)參數(shù)傳遞靖秩,簡(jiǎn)稱request或者req。
HTTP請(qǐng)求一般分為兩部分:請(qǐng)求頭(Request Header)和請(qǐng)求體(Requset Body)竖瘾。
請(qǐng)求體想對(duì)較長(zhǎng)沟突,需要一定時(shí)間傳輸,http.ServerRequest 提供了3個(gè)事件用于控制請(qǐng)求體傳輸捕传。
- data:當(dāng)請(qǐng)求體數(shù)據(jù)到來(lái)時(shí)惠拭,該事件被觸發(fā)。該事件提供一個(gè)參數(shù)chunk庸论,表示接收到的數(shù)據(jù)职辅。如果該事件沒(méi)有被監(jiān)聽(tīng)今野,那么請(qǐng)求提將會(huì)被拋棄。該事件可能被調(diào)用多次罐农。
- end:當(dāng)請(qǐng)求體數(shù)據(jù)傳輸完成時(shí)条霜,該事件被觸發(fā),到時(shí)候?qū)⒉粫?huì)再有數(shù)據(jù)到來(lái)涵亏。
- close:用戶當(dāng)前請(qǐng)求結(jié)束時(shí)宰睡,該事件被觸發(fā)。不同于end气筋,如果用戶強(qiáng)制終止了傳輸拆内,也還是調(diào)用close。
serverrequest的一些屬性如下圖所示:
- 獲取GET請(qǐng)求內(nèi)容
GET請(qǐng)求直接被嵌入在路徑中宠默,URL是完整的請(qǐng)求路徑麸恍,包括?后面的部分搀矫,因此我們可以手動(dòng)解析后面的內(nèi)容作為GET請(qǐng)求的參數(shù)抹沪。
Node.js的url模塊中的parse函數(shù)提供了這個(gè)功能,通過(guò)url.parse瓤球,原始的path可以被解析為一個(gè)對(duì)象融欧,其中query就是GET所請(qǐng)求的內(nèi)容,路徑是pathname卦羡。
http://127.0.0.1:3000/user?name=byvoid&email=byvoid@byvoid.com
{ search: '?name=byvoid&email=byvoid@byvoid.com', query: { name: 'byvoid', email: 'byvoid@byvoid.com' }, pathname: '/user',path: '/user?name=byvoid&email=byvoid@byvoid.com', href: '/user?name=byvoid&email=byvoid@byvoid.com' }
獲取POST請(qǐng)求的內(nèi)容
相比GET請(qǐng)求吧所有的內(nèi)容編碼到訪問(wèn)路徑中噪馏,POST請(qǐng)求的內(nèi)容全部在請(qǐng)求體中。Node.js默認(rèn)不會(huì)解析請(qǐng)求體绿饵,需要手動(dòng)解析欠肾。http.ServerResponse
http.ServerResponse hi返回給客戶端你的信息,決定了用戶最終能看到的結(jié)果拟赊。
是由http.Server的request事件發(fā)送的刺桃,作為第二個(gè)參數(shù)傳遞,一般稱為response或res要门。
http.ServerResponse 有三個(gè)成員函數(shù)虏肾,用于返回響應(yīng)頭、響應(yīng)內(nèi)容以及結(jié)束請(qǐng)求欢搜。
- response.writeHead(statusCode,[headers]):向請(qǐng)求的客戶端發(fā)送響應(yīng)頭封豪。statusCode是狀態(tài)碼。該函數(shù)在一個(gè)請(qǐng)求只能調(diào)用一次炒瘟。
- resopnse.write(data,[encoding]) 向請(qǐng)求的客戶端發(fā)送響應(yīng)內(nèi)容吹埠,data是字符串或buffer。在resoopnse.end調(diào)用之前,response.write可以被調(diào)用多次缘琅。
- resopnse.end([data],[encoding]) 結(jié)束響應(yīng)粘都。該函數(shù)必須被調(diào)用一次。如果不調(diào)用刷袍,客戶端永遠(yuǎn)處于等待狀態(tài)翩隧。
-
HTTP客戶端
兩個(gè)函數(shù) http.request 和 http.get ,作為客戶端向http服務(wù)器發(fā)起請(qǐng)求呻纹。
-
http.request(options,callback)
發(fā)起HTTP請(qǐng)求堆生。option是一個(gè)類似關(guān)聯(lián)數(shù)組的對(duì)象,表示請(qǐng)求的參數(shù)雷酪。callback是請(qǐng)求的回調(diào)函數(shù)淑仆。
option參數(shù)如下:
- host : 請(qǐng)求網(wǎng)站的域名或IP地址。
- port : 請(qǐng)求網(wǎng)站的端口哥力,默認(rèn)是80蔗怠。
- method:請(qǐng)求方法,默認(rèn)是GET吩跋。
- path:請(qǐng)求的的相對(duì)于根的路徑寞射,默認(rèn)是“/”。
- headers:一個(gè)關(guān)聯(lián)數(shù)組的對(duì)象钞澳,為請(qǐng)求頭的內(nèi)容怠惶。
callback傳遞一個(gè)參數(shù),為 http.ClientResponse 的實(shí)例轧粟。
2. http.get(options,callback) 是http.request的簡(jiǎn)化版,自動(dòng)將請(qǐng)求設(shè)置為了GET請(qǐng)求脓魏,不需要手動(dòng)調(diào)動(dòng)req.end()兰吟。
3. http.ClientRequest
http.ClientRequest 是返回產(chǎn)生的對(duì)象,提供一個(gè)response事件茂翔,即http.request或http.get第二個(gè)參數(shù)指定的回調(diào)函數(shù)的綁定對(duì)象混蔼。可以被顯式地綁定這個(gè)事件的監(jiān)聽(tīng)函數(shù)珊燎。
4. http.ClientResponse
-
問(wèn)題總結(jié)
這幾個(gè)函數(shù)還是暈暈的惭嚣,服務(wù)器請(qǐng)求函數(shù)?向誰(shuí)請(qǐng)求