node.js详解Http服务器
生活随笔
收集整理的這篇文章主要介紹了
node.js详解Http服务器
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
概念:Node.js提供了http模塊。其中封裝了一個高效的HTTP服務(wù)器和一個建議的HTTP客戶端。
???http.server是一個基于事件的HTTP服務(wù)器。內(nèi)部有C++實現(xiàn)。接口由JavaScript封裝。
????????????http.request則是一個HTTP客戶端工具。用戶向服務(wù)器發(fā)送請求。
代碼分析: http.createServer創(chuàng)建了一個http.Server的實例,將一個函數(shù)作為HTTP請求處理函數(shù)。這個函數(shù)接受兩個參數(shù),請求對象req和相應(yīng)對象的res。res顯式寫入了響應(yīng)代碼200(表示請求成功),指定相應(yīng)頭,寫入響應(yīng)體。調(diào)用end結(jié)束并發(fā)送。該實例調(diào)用listen函數(shù),啟動服務(wù)器并監(jiān)聽3000端口。
一、HTTP服務(wù)器
http.Server實現(xiàn)的,它提供了一套封裝級別很低的API,僅僅是流控制和簡單的解析,所有的高層功能都需要通過它的接口 app.js案例 //引入模塊 var http=require('http') //創(chuàng)建服務(wù) var server=http.createServer(function(req,res){//相當(dāng)于action都在這里定義//響應(yīng)頭res.writeHead(200,{'Content-Type':'text/html'});//相應(yīng)內(nèi)容res.write('<h1>Node.js</h1>');//結(jié)束響應(yīng)res.end('<p>PCAT</p>'); //監(jiān)聽端口 }) server.listen(3000); server.on('close',function(){console.log('server is close'); }) console.log('HTTP server is listening at port 3000.');代碼分析: http.createServer創(chuàng)建了一個http.Server的實例,將一個函數(shù)作為HTTP請求處理函數(shù)。這個函數(shù)接受兩個參數(shù),請求對象req和相應(yīng)對象的res。res顯式寫入了響應(yīng)代碼200(表示請求成功),指定相應(yīng)頭,寫入響應(yīng)體。調(diào)用end結(jié)束并發(fā)送。該實例調(diào)用listen函數(shù),啟動服務(wù)器并監(jiān)聽3000端口。
???????????1.http.Server的事件
http.Server是一個基于事件的HTTP服務(wù)器,所有請求都被封裝到獨立的事件,開發(fā)者只要對它的事件編寫相應(yīng)函數(shù)可實現(xiàn)HTTP服務(wù)器的所有功能,它繼承與EventEmitter,提供了以下事件: ???request:當(dāng)客戶端請求到來時,該事件被觸發(fā),提供兩個參數(shù)req和res,分別是http.ServerRequest和http.ServerResponse的實例,表示請求和響應(yīng)信息。 connection:當(dāng)TCP連接建立時,該事件被觸發(fā),提供一個參數(shù)socket,為net.Socket的實例(底層協(xié)議對象)。 close:當(dāng)服務(wù)器關(guān)閉時,該事件被觸發(fā)。 除此之外還有checkContinue、upgrade、clientError事件。 最常用和關(guān)心的是:request事件,http提供了一個捷徑,http.createServer([requestListener]) 顯式實現(xiàn)方法: 案例:server.js var http=require('http'); var server=new http.Server(); server.on('request',function(req,res){res.writeHead(200,{'Content-Type':'text/html'});res.write('<h1>we are pcat</h1>');res.end("<p>I'm marico.</p>"); }); server.listen(3000);????????????2.http.ServerRequest請求的信息
此對象是后端開發(fā)者最關(guān)注的內(nèi)容,它一般由http.Server的request事件發(fā)送,作為第一個參數(shù)傳遞,通常簡寫成request或req。 HTTP請求分為兩部分:請求頭和請求體。,請求內(nèi)容短的直接在請求頭解析完成后立即讀取,而請求體可能相對較長,需要一定的時間傳輸,因此提供了3個事件用于控制請求體傳輸。 ???(1)data:當(dāng)請求體數(shù)據(jù)到來時,該事件被觸發(fā),該事件一共一個參數(shù)chunk,表示接受到的數(shù)據(jù)。 ????????????????(2)end:當(dāng)請求體數(shù)據(jù)傳輸完成時,該事件被觸發(fā),此后將不會再有數(shù)據(jù)到來。 (3)close:用戶當(dāng)前請求結(jié)束時,該事件被觸發(fā),不同于end,如果用戶強(qiáng)制終止了傳輸,也會觸發(fā)close ServerReuqest的屬性 complete:客戶端請求是否已經(jīng)發(fā)送完成 httpVersion??? HTTP協(xié)議版本,通常是1.0或1.1 method??????? HTTP請求方法,如:GET,POST url????????????????原始的請求路徑,例如/pc/getUser或/user?name=marico headers?????? HTTP請求頭 trailers???????HTTP請求尾(不常見) connection??????????????當(dāng)前HTTP連接套接字,為net.Socket的實例 socket???????????????????connection屬性的別名 client????????????client屬性的別名????????????3.獲取GET請求內(nèi)容
由于GET請求直接被嵌入在路徑中,URL完整的請求路徑,包括了?后面的部分,因此你可以手動解析后面的內(nèi)容作為GET的參數(shù),Nodejs的url模塊中的parse函數(shù)提供了這個功能 案例:get.js //引入模塊 var http=require('http'); var urls=require('url'); var util=require('util'); //創(chuàng)建服務(wù) http.createServer(function(req,res){res.writeHead(200,{'Content-Type':'text/plain'});//解析并打成字符串形式返回給客戶端res.end(util.inspect(urls.parse(req.url,true))); }).listen(3000);?????????????4.獲取POST請求內(nèi)容
POST請求的內(nèi)容全部都在請求體中,http.ServerRequest并沒有一個屬性內(nèi)容為請求體,原因是等待請求體傳輸可能是一件耗時的工作。譬如上傳文件。惡意的POST請求會大大消耗服務(wù)器的資源。所以Nodejs是不會解析請求體,當(dāng)你需要的時候,需要手動來做。 post.js var http=require('http'); var querystring=require('querystring'); var util=require('util'); http.createServer(function(req,res){var post='技術(shù)共享CSDN';//注冊data事件監(jiān)聽函數(shù),每當(dāng)接受請求體的數(shù)據(jù)req.on('data',function(chunk){post+=chunk;});req.on('end',function(){//解析成真正的post為真正的post請求格式//相當(dāng)于Ext.decode()post=querystring.parse(post);//向前端返回res.end(util.inspect(post));}); }).listen(3000);??????????????5.http.ServerResponse返回給客戶端的信息
決定了用戶最終能到的結(jié)果,它是由http.Server的request事件發(fā)送的,作為第二個參數(shù)傳遞。一般為response或res 主要的三個函數(shù): response.writeHead(statusCode,[headers]):向請求的客戶端發(fā)送響應(yīng)頭。 statusCode是HTTP的狀態(tài)碼,如200為成功,404未找到等。 headers是一個類似關(guān)聯(lián)數(shù)組的對象,表示響應(yīng)頭的每個屬性。 response.write(data,[encoding]) 向請求客戶端發(fā)送相應(yīng)內(nèi)容,data是buffer或字符串,encoding為編碼 response.end([data],[encoding]) 結(jié)束響應(yīng),告知用戶所有發(fā)送已經(jīng)完成,當(dāng)所有要返回的內(nèi)容發(fā)送完畢,該函數(shù)必須被調(diào)用一次,如果不調(diào)用,客戶端永遠(yuǎn)處于等待狀態(tài)總結(jié)
以上是生活随笔為你收集整理的node.js详解Http服务器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使自己的注意力集中方法
- 下一篇: 纸牌三角形(蓝桥杯)