我最近在研究nodejs的路上,正好這兩天了解了nodejs HTTP服務(wù),那么今天也算個學習筆記吧!
十多年的隴西網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都營銷網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整隴西建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“隴西網(wǎng)站設(shè)計”,“隴西網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
nodejs最重要的方面之一是具有非常迅速的實現(xiàn)HTTP和HTTPS服務(wù)器和服務(wù)的能力。http服務(wù)是相當?shù)蛯哟蔚模憧赡芤玫讲煌哪K,如express來實現(xiàn)完整的Web服務(wù)器,http模塊不提供處理路由、cookie、緩存等的調(diào)用。我們主要用http模塊的地方是實現(xiàn)供應(yīng)用程序使用的后端Web服務(wù)。
1.處理URL
統(tǒng)一資源定位符(URL)為把一個請求發(fā)到正確的服務(wù)器的特定端口上,并訪問合適的數(shù)據(jù)提供了所有需要的信息。一個URL可以被分解成幾個不同的組成部分,每個部分都為Web服務(wù)器如何路由和處理來自客戶端的HTTP請求提供一塊基本的信息。node提供了url模塊,提供了把一個URL字符串轉(zhuǎn)換成一個URL對象的功能。
要從一個URL字符串創(chuàng)建URL對象,把URL字符串作為第一個參數(shù)下面的方法:
url.parse(urlStr,[parseQueryString],[slashesDenoteHost)
其中,parseQueryString參數(shù)是一個布爾值,如果為true,那么也把URL的查詢字符串部分解析為對象字面量,默認值為false。
slashesDenoteHost參數(shù)也是一個布爾值,如果為true,那么就會把格式為//host/path的URL解析為{host:'host',pathname:'/path'},而不是{pathname:'//host/path'}
還可以用url.format(urlObj)方法將一個URL對象轉(zhuǎn)換成字符串的形式。
由url.parse()創(chuàng)建出來的URL對象的屬性:
2.解析URL組件
url模塊有用的一種功能就是用與瀏覽器相同的方式來解析URL的組件,這可以讓你在服務(wù)器端操作URL字符串,以在URL中作出調(diào)整。
把一個URL解析到新的位置:
url.resolve(from,to)
其中,from指定了原始基礎(chǔ)URL字符串,to指定了想要URL被解析到的新位置。
舉個例子:
var url=require('url'); var originalUrl='http://user:pass@host:80/resource/path?query=string#hash'; var newResource='/another/path?querynew'; console.log(url.resolve(originalUrl,newResource));
3.處理查詢字符串和表單參數(shù)
HTTP請求通常在URL中包含查詢字符串(由URL對象獲得)或在正文內(nèi)包含參數(shù)數(shù)據(jù)來處理表單的提交(從客戶端請求的正文讀出)。查詢字符串和表單參數(shù)都只是基本的鍵值對,需要使用querystring模塊的parse()方法將字符串轉(zhuǎn)換成JavaScript對象:
querystring.parse(str,[sep],[eq],[options])
str是查詢或參數(shù)字符串,sep參數(shù)允許你指定使用的分隔符,默認的分隔符是&,eq參數(shù)允許你指定分析時使用的賦值運算符,默認值為=,options參數(shù)是一個具有屬性maxKeys的對象,它能夠讓你限制生成的對象可以包含的鍵的數(shù)量,默認是1000。
var qstring=require('querystring'); var params=qstring.parse('name=Braad&color=red&color=blue'); console.log(params);
4.請求、響應(yīng)和服務(wù)器對象
(1) http.ClientRequest對象
當你構(gòu)建一個HTTP客戶端時,調(diào)用http.request()使得一個ClientRequest對象在內(nèi)部被創(chuàng)建,這個對象是為了當該請求在服務(wù)器上進展的時候來表示它。通常使用ClientRequest對象來啟動、監(jiān)控和處理來自服務(wù)器的響應(yīng)。
實現(xiàn)ClientRequest對象:
http.request(options,callback)
其中,options參數(shù)是一個對象,其屬性定義了如何把客戶端的HTTP請求打開并發(fā)送到服務(wù)器,包括host,path,method,port等屬性。callback是一個回調(diào)函數(shù),在把請求發(fā)送到服務(wù)器后,處理從服務(wù)器返回的響應(yīng)時調(diào)用此回調(diào)函數(shù),此回調(diào)函數(shù)唯一的參數(shù)是一個IncomingMessage對象,該對象是來自服務(wù)器的響應(yīng)。
一個ClientRequest對象的基本實現(xiàn):
var http=require('http'); var options={ hostname:'www.myserver.com', path:'/', port:'8080', method:'POST' }; var req=http.request(options,function(response){ var str=''; response.on('data',function(chunk){ str+=chunk; }); response.on('end',function(){ console.log(str); }); }); req.end();
ClientRequest對象的方法:
(2)http.ServerResponse對象
當HTTP服務(wù)器接收到一個Request事件時,它在內(nèi)部創(chuàng)建ServerResponse對象,這個對象作為第二個參數(shù)被傳遞到request事件處理程序??梢允褂肧erverResponse對象指定并發(fā)送到客戶端的響應(yīng)。
ServerResponse對象的方法:
(3)http.IncomingMessage對象
HTTP服務(wù)器和客戶端都創(chuàng)建IncomingMessage對象,該對象實現(xiàn)了Readable流,讓你能夠把客戶端請求或服務(wù)器響應(yīng)作為流院讀入,這意味著它們的readable和data事件可以被監(jiān)聽并用來從流中讀出數(shù)據(jù)。
IncomingMessage對象中可用的事件、屬性和方法
(4)HTTP Server對象
HTTP Server對象提供了實現(xiàn)HTTP服務(wù)器的基本框架,它提供了一個監(jiān)聽端口的底層套接字和接收請求,然后發(fā)送響應(yīng)給客戶端連接的處理程序,當服務(wù)器正在監(jiān)聽時,node應(yīng)用程序并沒有結(jié)束。
要啟動HTTP服務(wù)器,首先需要createServer()方法創(chuàng)建一個Server對象:
http.createServer([requestListener])
此方法返回Server對象,requestListener參數(shù)是在請求事件被觸發(fā)時執(zhí)行的回調(diào)函數(shù),此回調(diào)函數(shù)接收兩個參數(shù),一個是代表客戶端請求的IncomingMessage對象,第二個參數(shù)是用來指定和發(fā)送響應(yīng)的ServerResponse對象。
創(chuàng)建了server對象,就可以在server對象上的listen()方法開始監(jiān)聽它:
listen(port,[hostname],[backlog],[callback])
一個基本的例子:
var http=require('http'); http.createServer(function(req,res){ //handle resquest and response }).listen(8080);
實現(xiàn)一個基本的靜態(tài)文件服務(wù)
//實現(xiàn)一個靜態(tài)文件服務(wù)器 var fs=require('fs'); var http=require('http'); var url=require('url'); //創(chuàng)建一個服務(wù)器 http.createServer(function(req,res){ if(req.url!="/favicon.ico"){ var urlObj=url.parse(req.url,true,false); console.log(urlObj.pathname); fs.readFile('.'+urlObj.pathname+'.html',function(err,data){ if(err){ res.writeHead(404); res.end(JSON.stringify(err)); return; } console.log(data.toString()); //將文件的內(nèi)容寫入res響應(yīng)對象 res.end(data); }); } }).listen(8080); //實現(xiàn)一個HTTP客戶端,向服務(wù)器發(fā)送一個GET請求來檢索文件內(nèi)容 var options={ hostname:'127.0.0.1', port:'8080', path:'/aaa' }; //on('data')讀取來自服務(wù)器的響應(yīng)中的內(nèi)容,on('end')把文件內(nèi)容記錄到到一個文件 function handleResponse(response){ var serverData=''; response.on('data',function(chunk){ serverData+=chunk; }); response.on('end',function(){ console.log(serverData); }); } http.request(options,function(response){ handleResponse(response); }).end();
實現(xiàn)動態(tài)的GET服務(wù)器
var http=require('http'); var messages=[ 'message1', 'message2', 'message3' ]; http.createServer(function(req,res){ res.setHeader('Content-Type','text/html'); res.writeHead(200); res.write('<html><head><title>HTTP Server</title></head>'); res.write('<body>'); for(var idx in messages){ res.write('\n<h2>'+messages[idx]+'</h2>'); } res.end('\n</body></html>'); }).listen(8080); var options={ hostname:'localhost', port:'8080' }; function handleResponse(response){ var serverData=''; response.on('data',function(chunk){ serverData+=chunk; }); response.on('end',function(){ console.log('response status: ',response.statusCode); console.log('response headers: ',response.headers); console.log(serverData); }); } http.request(options,function(response){ handleResponse(response); }).end();
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
網(wǎng)站名稱:深入解析nodejsHTTP服務(wù)
標題來源:http://jinyejixie.com/article34/ipjhse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、電子商務(wù)、軟件開發(fā)、品牌網(wǎng)站設(shè)計、Google、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)