亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

深入解析nodejs HTTP服務

2019-11-19 15:59:31
字體:
來源:轉載
供稿:網友

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

nodejs最重要的方面之一是具有非常迅速的實現HTTP和HTTPS服務器和服務的能力。http服務是相當低層次的,你可能要用到不同的模塊,如express來實現完整的Web服務器,http模塊不提供處理路由、cookie、緩存等的調用。我們主要用http模塊的地方是實現供應用程序使用的后端Web服務。

 1.處理URL

統一資源定位符(URL)為把一個請求發到正確的服務器的特定端口上,并訪問合適的數據提供了所有需要的信息。一個URL可以被分解成幾個不同的組成部分,每個部分都為Web服務器如何路由和處理來自客戶端的HTTP請求提供一塊基本的信息。node提供了url模塊,提供了把一個URL字符串轉換成一個URL對象的功能。

要從一個URL字符串創建URL對象,把URL字符串作為第一個參數下面的方法:

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

其中,parseQueryString參數是一個布爾值,如果為true,那么也把URL的查詢字符串部分解析為對象字面量,默認值為false。

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

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

由url.parse()創建出來的URL對象的屬性:

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

2.解析URL組件

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

把一個URL解析到新的位置:

url.resolve(from,to)

其中,from指定了原始基礎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.處理查詢字符串和表單參數

HTTP請求通常在URL中包含查詢字符串(由URL對象獲得)或在正文內包含參數數據來處理表單的提交(從客戶端請求的正文讀出)。查詢字符串和表單參數都只是基本的鍵值對,需要使用querystring模塊的parse()方法將字符串轉換成JavaScript對象:

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

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

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

4.請求、響應和服務器對象

(1) http.ClientRequest對象

當你構建一個HTTP客戶端時,調用http.request()使得一個ClientRequest對象在內部被創建,這個對象是為了當該請求在服務器上進展的時候來表示它。通常使用ClientRequest對象來啟動、監控和處理來自服務器的響應。

實現ClientRequest對象:

http.request(options,callback)

其中,options參數是一個對象,其屬性定義了如何把客戶端的HTTP請求打開并發送到服務器,包括host,path,method,port等屬性。callback是一個回調函數,在把請求發送到服務器后,處理從服務器返回的響應時調用此回調函數,此回調函數唯一的參數是一個IncomingMessage對象,該對象是來自服務器的響應。

一個ClientRequest對象的基本實現:

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

(2)http.ServerResponse對象

當HTTP服務器接收到一個Request事件時,它在內部創建ServerResponse對象,這個對象作為第二個參數被傳遞到request事件處理程序??梢允褂肧erverResponse對象指定并發送到客戶端的響應。

ServerResponse對象的方法:

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

(3)http.IncomingMessage對象

HTTP服務器和客戶端都創建IncomingMessage對象,該對象實現了Readable流,讓你能夠把客戶端請求或服務器響應作為流院讀入,這意味著它們的readable和data事件可以被監聽并用來從流中讀出數據。

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

  1. close   當底層套接字被關閉時發出
  2. httpVersion   指定用于構建客戶端請求/響應的HTTP版本
  3. headers   包含了隨請求/響應發送的標頭的一個對象
  4. method   指定用于請求/響應的方法
  5. url   發送到服務器的URL字符串
  6. statusCode   指定來自服務器的3位數狀態碼
  7. socket   一個指向net.Socket對象的句柄,用來與客戶端/服務器的通信
  8. setTimeout(timeout,[callback])   設置連接的套接字超時時間

(4)HTTP Server對象

HTTP Server對象提供了實現HTTP服務器的基本框架,它提供了一個監聽端口的底層套接字和接收請求,然后發送響應給客戶端連接的處理程序,當服務器正在監聽時,node應用程序并沒有結束。

要啟動HTTP服務器,首先需要createServer()方法創建一個Server對象:

http.createServer([requestListener])

此方法返回Server對象,requestListener參數是在請求事件被觸發時執行的回調函數,此回調函數接收兩個參數,一個是代表客戶端請求的IncomingMessage對象,第二個參數是用來指定和發送響應的ServerResponse對象。

創建了server對象,就可以在server對象上的listen()方法開始監聽它:

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

一個基本的例子:

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

實現一個基本的靜態文件服務

//實現一個靜態文件服務器var fs=require('fs');var http=require('http');var url=require('url');//創建一個服務器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());      //將文件的內容寫入res響應對象      res.end(data);    });  }}).listen(8080);//實現一個HTTP客戶端,向服務器發送一個GET請求來檢索文件內容var options={  hostname:'127.0.0.1',  port:'8080',  path:'/aaa'};//on('data')讀取來自服務器的響應中的內容,on('end')把文件內容記錄到到一個文件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();

實現動態的GET服務器

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();

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情高清视频| 在线国产精品播放| 国产午夜精品视频免费不卡69堂| 丝袜一区二区三区| 精品亚洲一区二区三区在线播放| 性视频1819p久久| 黄色成人在线播放| 久久免费在线观看| 亚洲成人精品视频在线观看| 富二代精品短视频| 青青草原成人在线视频| 成人免费看吃奶视频网站| 国产精品一区二区久久久| 欧美国产高跟鞋裸体秀xxxhd| 久久人人爽人人爽爽久久| 中文字幕亚洲欧美一区二区三区| 色香阁99久久精品久久久| 日韩中文字幕在线观看| 久久久久久久久久av| 国产精品免费一区二区三区都可以| 国产成人黄色av| 亚洲福利在线看| 成人春色激情网| 国产欧美精品一区二区三区介绍| 国产精品直播网红| 久热精品视频在线免费观看| 97在线看福利| 欧美在线播放视频| 91精品国产99久久久久久| 精品视频在线播放| 91在线视频免费| 久久久久日韩精品久久久男男| 欧美日韩国产精品一区二区三区四区| 91色p视频在线| 久久久久久国产三级电影| 亚洲午夜av久久乱码| 国产精品欧美日韩久久| 欧美在线欧美在线| 久久精品99久久久久久久久| 欧美成人四级hd版| 亚洲欧美综合图区| 久久深夜福利免费观看| 日韩资源在线观看| 国内精品小视频在线观看| 中文字幕日韩欧美在线| 久久亚洲精品国产亚洲老地址| 日韩亚洲欧美中文高清在线| 亚洲三级 欧美三级| 亚洲国产97在线精品一区| 欧美在线播放视频| 国产中文字幕亚洲| 欧美日韩国产综合视频在线观看中文| 国产成人精品一区二区| 国产精品嫩草影院一区二区| 高清视频欧美一级| 欧美美女操人视频| 国产91精品高潮白浆喷水| 日韩美女免费观看| 亚洲三级av在线| 日本欧美一二三区| 国产精品日韩专区| 91免费精品视频| 中文字幕综合在线| 亚洲性线免费观看视频成熟| 55夜色66夜色国产精品视频| 青草成人免费视频| 国产精品久久久| 欧美成人第一页| 久久成人精品视频| 欧美电影免费观看电视剧大全| 国产日韩精品一区二区| 国产精品偷伦免费视频观看的| 亚洲精品丝袜日韩| 亚洲伦理中文字幕| 91精品国产综合久久香蕉| 国产一区二区三区三区在线观看| 欧美成人精品一区| 2020欧美日韩在线视频| 欧美成人精品一区| 欧美韩国理论所午夜片917电影| 欧美中文字幕在线观看| 国产精品大陆在线观看| 51精品国产黑色丝袜高跟鞋| 久久香蕉国产线看观看网| 黑人巨大精品欧美一区二区免费| 欧美寡妇偷汉性猛交| 美女黄色丝袜一区| 日韩女优在线播放| 久久精品福利视频| 亚洲一区二区三区乱码aⅴ| 欧美色图在线视频| 欧美性极品xxxx做受| 国产精品久久久精品| 国产欧美一区二区白浆黑人| 亚洲男人天堂视频| 久久久久国色av免费观看性色| 日韩中文字幕久久| 91麻豆国产语对白在线观看| 欧美激情高清视频| 综合网中文字幕| 国产精国产精品| 中文字幕日韩av综合精品| 欧美片一区二区三区| 亚洲欧美综合区自拍另类| 人人澡人人澡人人看欧美| 97视频在线观看播放| 国产亚洲欧美日韩一区二区| 精品成人69xx.xyz| 久久天天躁狠狠躁夜夜躁2014| 国产ts人妖一区二区三区| 国产精品久久久久91| 欧美诱惑福利视频| 精品一区电影国产| 色www亚洲国产张柏芝| 69视频在线播放| 91午夜理伦私人影院| 最近2019中文字幕一页二页| 欧美日韩免费在线| 欧美巨乳美女视频| 久久国产精品免费视频| 97国产精品久久| 欧美性高潮床叫视频| 91九色国产社区在线观看| 亚洲精品日韩av| 国产精品久久久久久久久久尿| 最近的2019中文字幕免费一页| 国产欧美久久一区二区| 黑人巨大精品欧美一区二区免费| 亚洲精品国精品久久99热| 亚洲最新av在线| 国产一区在线播放| 国产精品第三页| 精品色蜜蜜精品视频在线观看| 91色中文字幕| 4438全国亚洲精品在线观看视频| 欧美日韩国产91| 久久精品一偷一偷国产| 亚洲视频在线观看免费| 高清欧美性猛交xxxx| 亚洲国内精品在线| 国产精品美女午夜av| 亚洲激情电影中文字幕| 欧美在线www| 国产成人97精品免费看片| 97视频在线观看亚洲| 久久精品99久久久久久久久| 成人精品视频在线| 欧美日韩高清在线观看| 国产精品黄色影片导航在线观看| 中文字幕av日韩| 国产视频综合在线| 亚洲图片欧美午夜| 国产精品久在线观看| 亚洲激情在线视频| 一道本无吗dⅴd在线播放一区| 国产日韩在线看| 欧美丝袜第一区| 亚洲精品国产综合区久久久久久久| 亚洲欧美国产制服动漫| 久久色免费在线视频| 98午夜经典影视| 久久免费视频在线| 欧美国产视频一区二区| 欧美日韩免费观看中文|