Nodejs核心模塊 HTTP服務(wù)器與客戶端

  • 概要

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)奏属。

  1. 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ù)蟹漓。

  1. 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的一些屬性如下圖所示:

  1. 獲取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' }
  1. 獲取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)解析欠肾。

  2. 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)求呻纹。

  1. 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)求

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悔政,一起剝皮案震驚了整個(gè)濱河市晚吞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谋国,老刑警劉巖槽地,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捌蚊,警方通過(guò)查閱死者的電腦和手機(jī)集畅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)缅糟,“玉大人挺智,你說(shuō)我怎么就攤上這事〈盎拢” “怎么了逃贝?”我有些...
    開(kāi)封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)迫摔。 經(jīng)常有香客問(wèn)我沐扳,道長(zhǎng),這世上最難降的妖魔是什么句占? 我笑而不...
    開(kāi)封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任沪摄,我火速辦了婚禮,結(jié)果婚禮上纱烘,老公的妹妹穿的比我還像新娘杨拐。我一直安慰自己,他們只是感情好擂啥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布哄陶。 她就那樣靜靜地躺著,像睡著了一般哺壶。 火紅的嫁衣襯著肌膚如雪屋吨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天山宾,我揣著相機(jī)與錄音至扰,去河邊找鬼。 笑死资锰,一個(gè)胖子當(dāng)著我的面吹牛敢课,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绷杜,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼直秆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鞭盟?” 一聲冷哼從身側(cè)響起圾结,我...
    開(kāi)封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎懊缺,沒(méi)想到半個(gè)月后疫稿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體培他,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年遗座,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舀凛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡途蒋,死狀恐怖猛遍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情号坡,我是刑警寧澤懊烤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站宽堆,受9級(jí)特大地震影響腌紧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜畜隶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一壁肋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧籽慢,春花似錦浸遗、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至届惋,卻和暖如春髓帽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盼樟。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工氢卡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晨缴。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像峡捡,于是被迫代替她去往敵國(guó)和親击碗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理们拙,服務(wù)發(fā)現(xiàn)稍途,斷路器,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 10,930評(píng)論 6 13
  • 使用 HTTP 服務(wù)器或客戶端功能必須調(diào)用require('http')砚婆。 Node 里的 HTTP 接口支持協(xié)議...
    保川閱讀 1,379評(píng)論 0 1
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測(cè)試 ...
    KeKeMars閱讀 6,313評(píng)論 0 6
  • 2017年高考各批次錄取目前正在有序地進(jìn)行著械拍。 “高中三年突勇,竟然輸給了一條草魚……”2017年6月8日一年一度為全...
    grapesunny閱讀 372評(píng)論 0 3