最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年07月25日 14:21:20   作者:LittleMoon  
本篇文章主要介紹了深入解析nodejs HTTP服務(wù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

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

nodejs最重要的方面之一是具有非常迅速的實(shí)現(xiàn)HTTP和HTTPS服務(wù)器和服務(wù)的能力。http服務(wù)是相當(dāng)?shù)蛯哟蔚?,你可能要用到不同的模塊,如express來(lái)實(shí)現(xiàn)完整的Web服務(wù)器,http模塊不提供處理路由、cookie、緩存等的調(diào)用。我們主要用http模塊的地方是實(shí)現(xiàn)供應(yīng)用程序使用的后端Web服務(wù)。

 1.處理URL

統(tǒng)一資源定位符(URL)為把一個(gè)請(qǐng)求發(fā)到正確的服務(wù)器的特定端口上,并訪(fǎng)問(wèn)合適的數(shù)據(jù)提供了所有需要的信息。一個(gè)URL可以被分解成幾個(gè)不同的組成部分,每個(gè)部分都為Web服務(wù)器如何路由和處理來(lái)自客戶(hù)端的HTTP請(qǐng)求提供一塊基本的信息。node提供了url模塊,提供了把一個(gè)URL字符串轉(zhuǎn)換成一個(gè)URL對(duì)象的功能。

要從一個(gè)URL字符串創(chuàng)建URL對(duì)象,把URL字符串作為第一個(gè)參數(shù)下面的方法:

url.parse(urlStr,[parseQueryString],[slashesDenoteHost)

其中,parseQueryString參數(shù)是一個(gè)布爾值,如果為true,那么也把URL的查詢(xún)字符串部分解析為對(duì)象字面量,默認(rèn)值為false。

slashesDenoteHost參數(shù)也是一個(gè)布爾值,如果為true,那么就會(huì)把格式為//host/path的URL解析為{host:'host',pathname:'/path'},而不是{pathname:'//host/path'}

還可以用url.format(urlObj)方法將一個(gè)URL對(duì)象轉(zhuǎn)換成字符串的形式。 

由url.parse()創(chuàng)建出來(lái)的URL對(duì)象的屬性:

  1. path     完整路徑,包括路徑和搜索
  2. query  要么是查詢(xún)字符串中的參數(shù)部分,要么是含有查詢(xún)字符串參數(shù)和值的解析后的對(duì)象。如果parseQueryString設(shè)置為true,那么就是解析后的對(duì)象
  3. search   URL的查詢(xún)字符串部分,包括前導(dǎo)的問(wèn)號(hào)
  4. pathname   URL的路徑部分(包括最初的斜線(xiàn),如果存在的話(huà))
  5. port   主機(jī)的端口號(hào)
  6. hostname  主機(jī)的主機(jī)名,小寫(xiě)
  7. auth  URL的身份認(rèn)證信息
  8. host  URL的完整主機(jī)部分,包括端口信息,小寫(xiě)
  9. protocol    請(qǐng)求協(xié)議
  10. href   這是最初解析的完整的URL字符串
  11. hash  URL的散列部分,包括井號(hào)

2.解析URL組件

url模塊有用的一種功能就是用與瀏覽器相同的方式來(lái)解析URL的組件,這可以讓你在服務(wù)器端操作URL字符串,以在URL中作出調(diào)整。

把一個(gè)URL解析到新的位置:

url.resolve(from,to)

其中,from指定了原始基礎(chǔ)URL字符串,to指定了想要URL被解析到的新位置。

舉個(gè)例子:

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.處理查詢(xún)字符串和表單參數(shù)

HTTP請(qǐng)求通常在URL中包含查詢(xún)字符串(由URL對(duì)象獲得)或在正文內(nèi)包含參數(shù)數(shù)據(jù)來(lái)處理表單的提交(從客戶(hù)端請(qǐng)求的正文讀出)。查詢(xún)字符串和表單參數(shù)都只是基本的鍵值對(duì),需要使用querystring模塊的parse()方法將字符串轉(zhuǎn)換成JavaScript對(duì)象:

querystring.parse(str,[sep],[eq],[options])

str是查詢(xún)或參數(shù)字符串,sep參數(shù)允許你指定使用的分隔符,默認(rèn)的分隔符是&,eq參數(shù)允許你指定分析時(shí)使用的賦值運(yùn)算符,默認(rèn)值為=,options參數(shù)是一個(gè)具有屬性maxKeys的對(duì)象,它能夠讓你限制生成的對(duì)象可以包含的鍵的數(shù)量,默認(rèn)是1000。

var qstring=require('querystring');
var params=qstring.parse('name=Braad&color=red&color=blue');
console.log(params);

4.請(qǐng)求、響應(yīng)和服務(wù)器對(duì)象

(1) http.ClientRequest對(duì)象

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

實(shí)現(xiàn)ClientRequest對(duì)象:

http.request(options,callback)

其中,options參數(shù)是一個(gè)對(duì)象,其屬性定義了如何把客戶(hù)端的HTTP請(qǐng)求打開(kāi)并發(fā)送到服務(wù)器,包括host,path,method,port等屬性。callback是一個(gè)回調(diào)函數(shù),在把請(qǐng)求發(fā)送到服務(wù)器后,處理從服務(wù)器返回的響應(yīng)時(shí)調(diào)用此回調(diào)函數(shù),此回調(diào)函數(shù)唯一的參數(shù)是一個(gè)IncomingMessage對(duì)象,該對(duì)象是來(lái)自服務(wù)器的響應(yīng)。

一個(gè)ClientRequest對(duì)象的基本實(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對(duì)象的方法:

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

(2)http.ServerResponse對(duì)象

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

ServerResponse對(duì)象的方法:

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

(3)http.IncomingMessage對(duì)象

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

IncomingMessage對(duì)象中可用的事件、屬性和方法

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

(4)HTTP Server對(duì)象

HTTP Server對(duì)象提供了實(shí)現(xiàn)HTTP服務(wù)器的基本框架,它提供了一個(gè)監(jiān)聽(tīng)端口的底層套接字和接收請(qǐng)求,然后發(fā)送響應(yīng)給客戶(hù)端連接的處理程序,當(dāng)服務(wù)器正在監(jiān)聽(tīng)時(shí),node應(yīng)用程序并沒(méi)有結(jié)束。

要啟動(dòng)HTTP服務(wù)器,首先需要createServer()方法創(chuàng)建一個(gè)Server對(duì)象:

http.createServer([requestListener])

此方法返回Server對(duì)象,requestListener參數(shù)是在請(qǐng)求事件被觸發(fā)時(shí)執(zhí)行的回調(diào)函數(shù),此回調(diào)函數(shù)接收兩個(gè)參數(shù),一個(gè)是代表客戶(hù)端請(qǐng)求的IncomingMessage對(duì)象,第二個(gè)參數(shù)是用來(lái)指定和發(fā)送響應(yīng)的ServerResponse對(duì)象。

創(chuàng)建了server對(duì)象,就可以在server對(duì)象上的listen()方法開(kāi)始監(jiān)聽(tīng)它:

listen(port,[hostname],[backlog],[callback])

一個(gè)基本的例子:

var http=require('http');
http.createServer(function(req,res){
  //handle resquest and response
}).listen(8080);

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

//實(shí)現(xiàn)一個(gè)靜態(tài)文件服務(wù)器
var fs=require('fs');
var http=require('http');
var url=require('url');
//創(chuàng)建一個(gè)服務(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)容寫(xiě)入res響應(yīng)對(duì)象
      res.end(data);
    });
  }
}).listen(8080);
//實(shí)現(xiàn)一個(gè)HTTP客戶(hù)端,向服務(wù)器發(fā)送一個(gè)GET請(qǐng)求來(lái)檢索文件內(nèi)容
var options={
  hostname:'127.0.0.1',
  port:'8080',
  path:'/aaa'
};
//on('data')讀取來(lái)自服務(wù)器的響應(yīng)中的內(nèi)容,on('end')把文件內(nèi)容記錄到到一個(gè)文件
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)動(dòng)態(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();

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于 Docker 開(kāi)發(fā) NodeJS 應(yīng)用

    基于 Docker 開(kāi)發(fā) NodeJS 應(yīng)用

    這是兩篇文章的第一篇。本文涵蓋了有關(guān)在使用 Express 框架開(kāi)發(fā)一個(gè)Node應(yīng)用時(shí),用Docker 替代 Vagrant 的比較詳細(xì)的教程, 應(yīng)用將使用 connect-redis 中間件將會(huì)話(huà)信息持久化到Redis中. 第二篇文章將介紹到將這個(gè)開(kāi)發(fā)的設(shè)置產(chǎn)品化.
    2014-07-07
  • 詳解nodejs解壓版安裝和配置(帶有搭建前端項(xiàng)目腳手架)

    詳解nodejs解壓版安裝和配置(帶有搭建前端項(xiàng)目腳手架)

    這篇文章主要介紹了詳解nodejs解壓版安裝和配置(帶有搭建前端項(xiàng)目腳手架) ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • 如何在node環(huán)境實(shí)現(xiàn)“get數(shù)據(jù)解析”代碼實(shí)例

    如何在node環(huán)境實(shí)現(xiàn)“get數(shù)據(jù)解析”代碼實(shí)例

    這篇文章主要介紹了如何在node環(huán)境實(shí)現(xiàn)“get數(shù)據(jù)解析”代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Async/Await替代Promise的6個(gè)理由

    Async/Await替代Promise的6個(gè)理由

    這篇文章主要介紹了Async/Await替代Promise的6個(gè)理由,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • nodejs+websocket實(shí)時(shí)聊天系統(tǒng)改進(jìn)版

    nodejs+websocket實(shí)時(shí)聊天系統(tǒng)改進(jìn)版

    這篇文章主要介紹了nodejs+websocket實(shí)時(shí)聊天系統(tǒng)的改進(jìn)版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Nodejs Express 通過(guò)log4js寫(xiě)日志到Logstash(ELK)

    Nodejs Express 通過(guò)log4js寫(xiě)日志到Logstash(ELK)

    這篇文章主要介紹了Nodejs Express 通過(guò)log4js寫(xiě)日志到Logstash(ELK),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • 用Node.js遍歷多級(jí)目錄處理文件的代碼詳解

    用Node.js遍歷多級(jí)目錄處理文件的代碼詳解

    在日常開(kāi)發(fā)中,處理大量的文件操作是一個(gè)常見(jiàn)的需求,特別是在圖像處理和存檔管理領(lǐng)域,本文給大家介紹了如何用Node.js遍歷多級(jí)目錄處理文件,文章給出了主要步驟和完整代碼,需要的朋友可以參考下
    2024-06-06
  • 如何從零開(kāi)始手寫(xiě)Koa2框架

    如何從零開(kāi)始手寫(xiě)Koa2框架

    這篇文章主要介紹了如何從零開(kāi)始手寫(xiě)Koa2框架,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Node.js中的模塊機(jī)制學(xué)習(xí)筆記

    Node.js中的模塊機(jī)制學(xué)習(xí)筆記

    這篇文章主要介紹了Node.js中的模塊機(jī)制學(xué)習(xí)筆記,本文講解了CommonJS模塊規(guī)范、Node模塊實(shí)現(xiàn)過(guò)程、模塊調(diào)用棧、包與NPM等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • node.js中的fs.futimesSync方法使用說(shuō)明

    node.js中的fs.futimesSync方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.futimes方法使用說(shuō)明,本文介紹了fs.futimesSync方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12

最新評(píng)論

绵阳市| 西城区| 兰考县| 龙山县| 隆化县| 巴里| 资溪县| 泰兴市| 泰和县| 曲靖市| 呼图壁县| 天水市| 宁波市| 简阳市| 大方县| 台北市| 苏州市| 鄂托克前旗| 南澳县| 潼关县| 木里| 博湖县| 宁陕县| 麦盖提县| 白河县| 乳山市| 巴彦淖尔市| 娱乐| 广东省| 石家庄市| 中江县| 临汾市| 德钦县| 九江县| 山西省| 阳谷县| 大竹县| 娄烦县| 项城市| 长阳| 松桃|