Node之HTTP服務(wù)器創(chuàng)建服務(wù)器和獲取客戶端請求數(shù)據(jù)

創(chuàng)建HTTP服務(wù)器

在Node.js中芜赌,可以很方便地創(chuàng)建一個HTTP服務(wù)器冤寿,只需調(diào)用http模塊中的create Server方法即可

var server=http.createServer([requestListener])

在createServer方法中桥嗤,可以使用一個可選參數(shù),參數(shù)值為一個回調(diào)函數(shù)菇篡,用于指定當(dāng)接收到客戶端請求時所需執(zhí)行的處理,該回調(diào)函數(shù)的指定方法如下所示一喘。

function (request,response) {
//回調(diào)函數(shù)代碼略
}

  • request:代表一個客戶端請求
  • response:代表一個服務(wù)器端響應(yīng)對象

createServer方法返回被創(chuàng)建的服務(wù)器對象驱还,如果不在createServer方法中使用參數(shù)嗜暴,也可以通過監(jiān)聽該方法創(chuàng)建的服務(wù)器對象的request事件(當(dāng)接收到客戶端請求時觸發(fā)),并且指定該事件觸發(fā)時調(diào)用的回調(diào)函數(shù)的方法來指定當(dāng)接收到客戶端請求時所需執(zhí)行的處理议蟆,代碼如下所示(代碼中的server代表一個HTTP服務(wù)器)闷沥。

server.on('request',function(request,response){
    //回調(diào)函數(shù)代碼略
});

在創(chuàng)建了HTTP服務(wù)器后,需要指定該服務(wù)器所要監(jiān)聽的地址(可以為一個IP地址咐容,也可以為一個主機(jī)名)及端口舆逃,這時,可以使用該HTTP服務(wù)器的listen方法

server.listen(port,[host],[backlog],[callback])
  • port:端口號
  • host:主機(jī)
  • backlog:最大連接數(shù)
  • callback:回調(diào)

也可使用listening事件實(shí)現(xiàn)

server.on('listening',function(){
    //回調(diào)函數(shù)代碼略
});

創(chuàng)建一個服務(wù)器完整示例:

var http = require('http');
var server=http.createServer(function (req, res) {
    //暫不指定接收到客戶端請求時的處理
}).listen(1337, "127.0.0.1",function(){
    console.log('服務(wù)器端開始監(jiān)聽戳粒。');
});

close()關(guān)閉服務(wù)器

server.close();

可以監(jiān)聽服務(wù)器被關(guān)閉以后

server.on('close',function(){
    //回調(diào)函數(shù)代碼略
});

監(jiān)聽服務(wù)器錯誤信息

server.on('error', function (e) {
    if (e.code == 'EADDRINUSE') {//當(dāng)?shù)刂芳岸丝诒徽加脮r錯誤代碼為'EADDRINUSE'
        //可以在此處指定當(dāng)?shù)刂芳岸丝诒徽加脮r所需執(zhí)行的處理
    }
});

長鏈接

在默認(rèn)情況下路狮,客戶端和服務(wù)器端每進(jìn)行一次HTTP操作,都將建立一次連接蔚约,客戶端與服務(wù)器端之間的交互通信完成后該連接就中斷奄妨。在HTTP1.1中,添加了長連接支持苹祟。如果客戶端發(fā)出的請求頭信息或者服務(wù)器端發(fā)出的響應(yīng)頭信息中加入了“Connection:keep-alive”信息砸抛,則HTTP連接將繼續(xù)保持,客戶端可以繼續(xù)通過相同的連接向服務(wù)器端發(fā)出請求树枫。

在Node.js中直焙,當(dāng)客戶端與服務(wù)器端建立連接時,觸發(fā)HTTP服務(wù)器對象的connection事件团赏,可以監(jiān)聽該事件并在該事件觸發(fā)時調(diào)用的回調(diào)函數(shù)中指定當(dāng)連接建立時所需要執(zhí)行的處理

server.on('connection',function(socket){
    //回調(diào)函數(shù)代碼略
});

在該回調(diào)函數(shù)中可以使用一個參數(shù)箕般,參數(shù)值為服務(wù)器端用于監(jiān)聽客戶端請求的socket端口對象。

設(shè)置服務(wù)器的超時時間

可以使用HTTP服務(wù)器的setTimeout方法來設(shè)置服務(wù)器的超時時間舔清。當(dāng)該超時時間超過之后丝里,客戶端不可繼續(xù)利用本次與HTTP服務(wù)器建立的連接,下次向該HTTP服務(wù)器發(fā)出請求時必須重新建立連接体谒。

server.setTimeout(msecs, callback)
  • mecs:參數(shù)值為一個整數(shù)杯聚,用于設(shè)置服務(wù)器的超時時間,單位為毫秒抒痒,可以通過將該參數(shù)值設(shè)置為0的方法取消服務(wù)器的超時處理幌绍。
  • callback:用于設(shè)置當(dāng)服務(wù)器超時時調(diào)用的回調(diào)函數(shù),在該回調(diào)函數(shù)中可以使用一個參數(shù)故响,參數(shù)值為服務(wù)器端用于監(jiān)聽客戶端請求的socket對象傀广。
server.on('timeout',function(socket){
    //回調(diào)函數(shù)代碼略
});

獲取客戶端請求信息

HTTP服務(wù)器接收到客戶端請求時調(diào)用的回調(diào)函數(shù)中的第一個參數(shù)值為一個http.IncomingMessage對象,該對象用于讀取客戶端請求流中的數(shù)據(jù)彩届,因此伪冰,當(dāng)從客戶端請求流中讀取到新的數(shù)據(jù)時觸發(fā)data事件,當(dāng)讀取完客戶端請求流中的數(shù)據(jù)時觸發(fā)end事件樟蠕。當(dāng)該對象被用于讀取客戶端請求流中的數(shù)據(jù)時贮聂,該對象擁有如下所示的一些屬性靠柑。

  • method:該屬性值為一個字符串,字符串值為客戶端向服務(wù)器端發(fā)送請求時使用的方法吓懈,例如“GET”歼冰、“POST”、“PUT”或“DELETE”耻警。
  • url:該屬性值為客戶端發(fā)送請求時使用的URL參數(shù)字符串隔嫡,例如“/”、“/user/1”榕栏、“/post/new/?param=value”畔勤。該屬性為一個非常重要的屬性,通常用來判斷客戶端請求的頁面及需要執(zhí)行的處理扒磁。
  • headers:該屬性值為客戶端發(fā)送的請求頭對象庆揪,其中存放了客戶端發(fā)送的所有請求頭信息,包括各種cookie信息以及瀏覽器的各種信息妨托。
  • httpVersion:該屬性值為一個字符串缸榛,字符串值為客戶端發(fā)送的HTTP版本,可能的值為“1.1”或“1.0”兰伤。
  • trailers:該屬性值為客戶端發(fā)送的trailer對象内颗。該對象中存放了客戶端附加的一些HTTP頭信息,該對象被包含在客戶端發(fā)送的請求數(shù)據(jù)之后敦腔,因此只有當(dāng)http.IncomingMessage對象的end事件觸發(fā)之后才能讀取到trailer對象中的信息均澳。
  • socket:該屬性值為服務(wù)器端用于監(jiān)聽客戶端請求的socket對象。

獲取請求數(shù)據(jù)

var http = require('http');
var fs = require('fs');
var server=http.createServer(function (req, res) {
    if(req.url!=="/favicon.ico"){
        req.on('data',function(data){
        console.log('服務(wù)器端接收到數(shù)據(jù):'+decodeURIComponent(data));
        });
        req.on('end',function(){
        console.log('客戶端請求數(shù)據(jù)已全部接收完畢符衔。');
        });
    }
    res.end();
}).listen(1337, "127.0.0.1");

轉(zhuǎn)換URL字符串與查詢字符串

在Node.js中找前,提供了一個url模塊與一個QueryString模塊,分別用來轉(zhuǎn)換完整URL字符串與URL中的查詢字符串判族。

在一個完整的URL字符串中躺盛,從“?”字符之后(不包括“?”字符)到“#”字符之前(如果存在“#”字符)或者到該URL字符串結(jié)束(如果不存在“#”字符)的這一部分稱為查詢字符串,例如在“http://google.com/user.php?userName=Lulingniu&age=40&sex=male#hash”這個URL字符串中形帮,“userName=Lulingniu&age=40&sex=male”這個部分稱為一個查詢字符串槽惫。

Query String模塊中的parse方法

可以使用Query String模塊中的parse方法將該字符串轉(zhuǎn)換為一個對象

querystring.parse(str,[sep],[eq],[options])
  • str:用于指定被轉(zhuǎn)換的查詢字符串;
  • sep:用于指定該查詢字符串中的分割字符辩撑,默認(rèn)參數(shù)值為“&”
  • eq:用于指定該查詢字符串中的分配字符界斜,默認(rèn)參數(shù)值為“=”
  • options:options參數(shù)值為一個對象,可以在該對象中使用一個整數(shù)值類型的maxKeys屬性來指定轉(zhuǎn)換后的對象中的屬性個數(shù)合冀,如果將maxKeys屬性值設(shè)定為0锄蹂,其效果等于不使用maxKeys屬性值。

Query String模塊中的stringify方法

可以使用Query String模塊中的stringify方法將對象轉(zhuǎn)換為一個查詢字符串

querystring.stringify(obj,[sep],[eq])
  • obj:用于指定被轉(zhuǎn)換的對象水慨;
  • sep:用于指定查詢字符串中所使用的分割字符得糜,默認(rèn)參數(shù)值為“&”;
  • eq:用于指定查詢字符串中使用的分配字符晰洒,默認(rèn)參數(shù)值為“=”朝抖。

url.parse()

在url模塊中,可以使用parse方法將URL字符串轉(zhuǎn)換為一個對象谍珊,根據(jù)URL字符串中的不同內(nèi)容治宣,該對象中可能具有的屬性及其含義如下所示。

  • href:被轉(zhuǎn)換的原URL字符串砌滞。
  • protocol:客戶端發(fā)出請求時使用的協(xié)議侮邀。
  • slashes:在協(xié)議與路徑中間是否使用“//”分隔符。
  • host:URL字符串中的完整地址及端口號贝润,該地址可能為一個IP地址绊茧,也可能為一個主機(jī)名。
  • auth:URL字符串中的認(rèn)證信息部分打掘。
  • hostname:URL字符串中的完整地址华畏,該地址可能為一個IP地址,也可能為一個主機(jī)名尊蚁。
  • port:URL字符串中的端口號亡笑。
  • pathname:URL字符串中的路徑,不包含查詢字符串横朋。
  • search:URL字符串中的查詢字符串仑乌,包含起始字符“?”琴锭。
  • path:URL字符串中的路徑晰甚,包含查詢字符串。
  • query:URL字符串中的查詢字符串祠够,不包含起始字符“压汪?”,或根據(jù)該查詢字符串而轉(zhuǎn)換的對象(根據(jù)parse方法所用參數(shù)而決定query屬性值)古瓤。
  • hash:URL字符串中的散列字符串止剖,包含起始字符“#”。
url.parse(urlStr,[parseQueryString])
  • urlStr:用于指定需要轉(zhuǎn)換的URL字符串落君;
  • parseQueryString:為一個布爾類型的參數(shù)穿香,當(dāng)參數(shù)值為true時,內(nèi)部使用Query String模塊將查詢字符串轉(zhuǎn)換為一個對象绎速,參數(shù)值為false時不執(zhí)行該轉(zhuǎn)換操作皮获,默認(rèn)參數(shù)值為false。

url.format()

可以使用url模塊中的format方法將URL字符串經(jīng)過轉(zhuǎn)換后的對象還原為一個URL字符串纹冤。

url.format(urlObj)

url.resolve()

可以使用resolve方法將兩個方法結(jié)合成為一個路徑

url.resolve(from,to
  • from:起點(diǎn)路徑字符串
  • to:參考路徑字符串

在resolve方法中洒宝,使用兩個字符串類型的參數(shù)购公,其中第一個參數(shù)為起點(diǎn)路徑字符串,第二個參數(shù)為參考路徑字符串雁歌。這兩個路徑既可為相對路徑宏浩,也可為絕對路徑。該方法返回轉(zhuǎn)換后的路徑靠瞎。

在結(jié)合路徑時比庄,以第一參數(shù)值為起點(diǎn)路徑,執(zhí)行如下所示的轉(zhuǎn)換規(guī)則乏盐。

  • 如果起點(diǎn)路徑為網(wǎng)絡(luò)路徑佳窑,參考路徑為非網(wǎng)絡(luò)路徑的絕對路徑,則返回路徑為網(wǎng)絡(luò)根目錄+參考路徑父能。
  • 在其他情況下神凑,如果參考路徑為絕對路徑,則返回路徑為該參考路徑法竞。
  • 如果起點(diǎn)路徑為一個不以“/”字符結(jié)尾的根目錄且參考路徑為相對路徑耙厚,則返回路徑為:起點(diǎn)路徑+“/”+參考路徑中去除開頭的“./”字符或“../”字符(如果存在的話)后的文字。如果起點(diǎn)路徑為一個以“/”字符結(jié)尾的根目錄且參考路徑為相對路徑岔霸,則返回起點(diǎn)路徑+參考路徑中去除開頭的“./”字符或“../”字符(如果存在的話)后的文字薛躬。
  • 如果起點(diǎn)路徑為一個不以“/”字符結(jié)尾的子目錄且參考路徑為相對路徑,同時開頭字符不為“./”或“../”呆细,則返回路徑為:起點(diǎn)路徑的上層目錄+“/”+參考路徑型宝。如果起點(diǎn)路徑為一個以“/”字符結(jié)尾的子目錄且參考路徑為相對路徑,同時開頭字符不為“./”或“../”絮爷,則返回路徑為:起點(diǎn)路徑的上層目錄+“/”+參考路徑趴酣。
  • 如果起點(diǎn)路徑為一個不以“/”字符結(jié)尾的子目錄且參考路徑為相對路徑,同時開頭字符為“./”坑夯,則返回路徑為:起點(diǎn)路徑的上層目錄+“/”+參考路徑中去除開頭的“./”字符后的文字岖寞。如果起點(diǎn)路徑為一個以“/”字符結(jié)尾的子目錄且參考路徑為相對路徑,同時開頭字符為“./”柜蜈,則返回起點(diǎn)路徑+參考路徑中去除開頭的“./”字符后的文字仗谆。
  • 如果起點(diǎn)路徑為一個不以“/”字符結(jié)尾的子目錄且參考路徑為相對路徑,同時開頭字符為“../”淑履,則返回路徑為:起點(diǎn)路徑的上層目錄的上層目錄+“/”+參考路徑中去除開頭的“../”字符后的文字隶垮。如果起點(diǎn)路徑為一個以“/”字符結(jié)尾的子目錄且參考路徑為相對路徑,同時開頭字符為“../”秘噪,則返
    回起點(diǎn)路徑的上層目錄+參考路徑中去除開頭的“../”字符后的文字狸吞。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蹋偏,更是在濱河造成了極大的恐慌便斥,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件威始,死亡現(xiàn)場離奇詭異椭住,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)字逗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宅广,“玉大人葫掉,你說我怎么就攤上這事「” “怎么了俭厚?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驶臊。 經(jīng)常有香客問我挪挤,道長,這世上最難降的妖魔是什么关翎? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任扛门,我火速辦了婚禮,結(jié)果婚禮上纵寝,老公的妹妹穿的比我還像新娘论寨。我一直安慰自己,他們只是感情好爽茴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布葬凳。 她就那樣靜靜地躺著,像睡著了一般室奏。 火紅的嫁衣襯著肌膚如雪火焰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天胧沫,我揣著相機(jī)與錄音昌简,去河邊找鬼。 笑死琳袄,一個胖子當(dāng)著我的面吹牛江场,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窖逗,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼址否,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起佑附,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤樊诺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后音同,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體词爬,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年权均,在試婚紗的時候發(fā)現(xiàn)自己被綠了顿膨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡叽赊,死狀恐怖恋沃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情必指,我是刑警寧澤囊咏,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站塔橡,受9級特大地震影響梅割,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜葛家,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一户辞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惦银,春花似錦咆课、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至迅栅,卻和暖如春殊校,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背读存。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工为流, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人让簿。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓敬察,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尔当。 傳聞我的和親對象是個殘疾皇子莲祸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

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

  • 人物介紹 鳳止沫 年如玉 沐白 李雅琴 第一章 我叫鳳止沫從小就是哥哥慕白養(yǎng)長大的,關(guān)于...
    鳳止沫閱讀 129評論 0 1
  • 秋詞二首 自古逢秋悲寂寥,我言秋日勝春朝锐帜。 晴空一鶴排云上田盈,便引詩情到碧霄。...
    晉顯閱讀 488評論 0 0
  • 親子日記第44天,一年級六班李欣怡媽媽 早上去上班蛮拔,剛下樓就看見外面下著小雨 述暂,早上一點(diǎn)都不冷。春天來了建炫,...
    欣怡媽媽閱讀 118評論 0 0
  • 今天是教師節(jié)踱卵,先祝福老師們:節(jié)日快樂,你們辛苦啦据过。 兩個閨蜜都是在教師行業(yè)惋砂,身邊很多同學(xué)也都從事著神圣的園丁職業(yè)。...
    penny胖妮閱讀 358評論 1 0
  • 我一直想學(xué)卻一直沒有學(xué)成的是英語绳锅。上學(xué)的時候英語成績很好西饵,也特別羨慕那些能夠流利的跟老外對話的人,所以一直夢想著能...
    遇見橙子閱讀 186評論 0 0