国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

深入解析nodejs HTTP服務(wù)

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:34:14
文檔

深入解析nodejs HTTP服務(wù)

深入解析nodejs HTTP服務(wù):我最近在研究nodejs的路上,正好這兩天了解了nodejs HTTP服務(wù),那么今天也算個學(xué)習(xí)筆記吧! nodejs最重要的方面之一是具有非常迅速的實(shí)現(xiàn)HTTP和HTTPS服務(wù)器和服務(wù)的能力。http服務(wù)是相當(dāng)?shù)蛯哟蔚?,你可能要用到不同的模塊,如express來實(shí)現(xiàn)完整的We
推薦度:
導(dǎo)讀深入解析nodejs HTTP服務(wù):我最近在研究nodejs的路上,正好這兩天了解了nodejs HTTP服務(wù),那么今天也算個學(xué)習(xí)筆記吧! nodejs最重要的方面之一是具有非常迅速的實(shí)現(xiàn)HTTP和HTTPS服務(wù)器和服務(wù)的能力。http服務(wù)是相當(dāng)?shù)蛯哟蔚?,你可能要用到不同的模塊,如express來實(shí)現(xiàn)完整的We

我最近在研究nodejs的路上,正好這兩天了解了nodejs HTTP服務(wù),那么今天也算個學(xué)習(xí)筆記吧!

nodejs最重要的方面之一是具有非常迅速的實(shí)現(xiàn)HTTP和HTTPS服務(wù)器和服務(wù)的能力。http服務(wù)是相當(dāng)?shù)蛯哟蔚模憧赡芤玫讲煌哪K,如express來實(shí)現(xiàn)完整的Web服務(wù)器,http模塊不提供處理路由、cookie、緩存等的調(diào)用。我們主要用http模塊的地方是實(shí)現(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的查詢字符串部分解析為對象字面量,默認(rèn)值為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對象的屬性:

  1. path     完整路徑,包括路徑和搜索
  2. query  要么是查詢字符串中的參數(shù)部分,要么是含有查詢字符串參數(shù)和值的解析后的對象。如果parseQueryString設(shè)置為true,那么就是解析后的對象
  3. search   URL的查詢字符串部分,包括前導(dǎo)的問號
  4. pathname   URL的路徑部分(包括最初的斜線,如果存在的話)
  5. port   主機(jī)的端口號
  6. hostname  主機(jī)的主機(jī)名,小寫
  7. auth  URL的身份認(rèn)證信息
  8. host  URL的完整主機(jī)部分,包括端口信息,小寫
  9. protocol    請求協(xié)議
  10. href   這是最初解析的完整的URL字符串
  11. hash  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ù)允許你指定使用的分隔符,默認(rèn)的分隔符是&,eq參數(shù)允許你指定分析時使用的賦值運(yùn)算符,默認(rèn)值為=,options參數(shù)是一個具有屬性maxKeys的對象,它能夠讓你限制生成的對象可以包含的鍵的數(shù)量,默認(rèn)是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對象

當(dāng)你構(gòu)建一個HTTP客戶端時,調(diào)用http.request()使得一個ClientRequest對象在內(nèi)部被創(chuàng)建,這個對象是為了當(dāng)該請求在服務(wù)器上進(jìn)展的時候來表示它。通常使用ClientRequest對象來啟動、監(jiān)控和處理來自服務(wù)器的響應(yīng)。

實(shí)現(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對象的基本實(shí)現(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對象的方法:

  1. write(chunk,[encoding])   把一個正文數(shù)據(jù)塊(Buffer或String對象)寫入請求
  2. end([data],[encoding])   把可選的數(shù)據(jù)寫入請求正文,然后刷新Writeable流并終止該請求
  3. abort()   終止當(dāng)前的請求
  4. setTimeout(timeout,[callback])   為請求設(shè)置套接字超時時間
  5. setNoDelay([noDelay])    禁用在發(fā)送數(shù)據(jù)之前緩沖數(shù)據(jù)的Nagle算法,noDelay是一個布爾值,true表示立即寫,false表示緩沖寫入
  6. setSocketKeepAlive([enable],[initialDelay])     啟用和禁用對客戶機(jī)請求的保持活動功能,enable默認(rèn)為false,即禁用;initialDelay指定最后一個數(shù)據(jù)包和第一個保持活動請求之間的延遲

(2)http.ServerResponse對象

當(dāng)HTTP服務(wù)器接收到一個Request事件時,它在內(nèi)部創(chuàng)建ServerResponse對象,這個對象作為第二個參數(shù)被傳遞到request事件處理程序??梢允褂肧erverResponse對象指定并發(fā)送到客戶端的響應(yīng)。

ServerResponse對象的方法:

  1. writeContinue()  發(fā)送一個HTTP/1.1 100 Continue消息給客戶端,請求被發(fā)送的正文內(nèi)容
  2. writeHead(statusCode,[reasonPhrase],[headers])    把一個響應(yīng)標(biāo)頭寫入請求,例如response.writeHead(200,'successs',{'Content-Length':body.length,'Content-Type':'text/plain'});
  3. setTimeout(timeout,[callback])   設(shè)置客戶端連接的套接字超時時間
  4. setHeader(name,value)   設(shè)置一個特定的標(biāo)頭值
  5. getHeader(name)   獲取已在響應(yīng)中設(shè)置的一個HTTP標(biāo)頭
  6. removeHeader(name)    移除已在響應(yīng)中設(shè)置的一個HTTP標(biāo)頭
  7. write(chunk,[encoding])   寫入chunk,Buffer或String對象到響應(yīng)Writeable流,僅把數(shù)據(jù)寫入響應(yīng)的正文部分
  8. addTrailers(headers)     將HTTP尾隨標(biāo)頭寫入響應(yīng)的結(jié)束處
  9. end([data],[encoding])   把可選的數(shù)據(jù)輸出寫入響應(yīng)的正文,然后刷新Writeable流并響應(yīng)該請求

(3)http.IncomingMessage對象

HTTP服務(wù)器和客戶端都創(chuàng)建IncomingMessage對象,該對象實(shí)現(xiàn)了Readable流,讓你能夠把客戶端請求或服務(wù)器響應(yīng)作為流院讀入,這意味著它們的readable和data事件可以被監(jiān)聽并用來從流中讀出數(shù)據(jù)。

IncomingMessage對象中可用的事件、屬性和方法

  1. close   當(dāng)?shù)讓犹捉幼直魂P(guān)閉時發(fā)出
  2. httpVersion   指定用于構(gòu)建客戶端請求/響應(yīng)的HTTP版本
  3. headers   包含了隨請求/響應(yīng)發(fā)送的標(biāo)頭的一個對象
  4. method   指定用于請求/響應(yīng)的方法
  5. url   發(fā)送到服務(wù)器的URL字符串
  6. statusCode   指定來自服務(wù)器的3位數(shù)狀態(tài)碼
  7. socket   一個指向net.Socket對象的句柄,用來與客戶端/服務(wù)器的通信
  8. setTimeout(timeout,[callback])   設(shè)置連接的套接字超時時間

(4)HTTP Server對象

HTTP Server對象提供了實(shí)現(xiàn)HTTP服務(wù)器的基本框架,它提供了一個監(jiān)聽端口的底層套接字和接收請求,然后發(fā)送響應(yīng)給客戶端連接的處理程序,當(dā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);

實(shí)現(xiàn)一個基本的靜態(tài)文件服務(wù)

//實(shí)現(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);
//實(shí)現(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();

實(shí)現(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<h1>'+messages[idx]+'</h1>');
 }
 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();

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

深入解析nodejs HTTP服務(wù)

深入解析nodejs HTTP服務(wù):我最近在研究nodejs的路上,正好這兩天了解了nodejs HTTP服務(wù),那么今天也算個學(xué)習(xí)筆記吧! nodejs最重要的方面之一是具有非常迅速的實(shí)現(xiàn)HTTP和HTTPS服務(wù)器和服務(wù)的能力。http服務(wù)是相當(dāng)?shù)蛯哟蔚?,你可能要用到不同的模塊,如express來實(shí)現(xiàn)完整的We
推薦度:
標(biāo)簽: js no http
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 日本不卡在线观看 | 高清视频一区 | 日本va视频 | 久久精品国产91久久综合麻豆自制 | 久久国产精品成人免费古装 | 国产成人黄网址在线视频 | 99久久精品国产一区二区小说 | 精品成人一区二区三区免费视频 | 在线看精品 | 免费的黄色毛片 | 久久国产亚洲欧美日韩精品 | 亚洲精品国产字幕久久vr | 日韩成人在线观看 | 99视频九九精品视频在线观看 | 岛国大片在线观看 | 91欧美亚洲| 日韩国产欧美一区二区三区 | 欧美中日韩在线 | 夜色毛片永久免费 | 日韩欧美高清 | 日韩在线二区 | 么公的又大又深又硬想要 | 激情欧美在线 | 国产一区二区福利久久 | 欧美成人免费高清视频 | 国产一区二区三区在线看 | a在线视频 | 亚洲欧美中文日韩综合 | 日韩第一页在线观看 | 国产一区二区三区视频在线观看 | 亚洲精品第一页 | 亚洲 欧美 中文 日韩专区 | 手机国产精品一区二区 | 午夜视频hd | 欧美 日韩 成人 | 日韩国产欧美一区二区三区 | 午夜国产大片免费观看 | 欧美亚洲国产精品 | 亚洲欧美网站 | 不卡的中文字幕 | 国产 日韩 欧美视频二区 |