nodejs入門總結(jié)四:http模塊

http模塊

node.js提供了http模塊彼念,其中封裝了一個(gè)http服務(wù)器和一個(gè)建議的http客戶端馆衔。
http.server是一個(gè)基于事件的http服務(wù)器物咳,內(nèi)部由c++實(shí)現(xiàn)炕吸,接口由JavaScript封裝愈涩。
http.request則是一個(gè)http客戶端工具,用戶向服務(wù)器發(fā)送請(qǐng)求肺蔚。

HTTP 模塊提供了 5 個(gè)類:
(1)http.Agent:創(chuàng)建全局實(shí)例煌妈,以管理 HTTP 客戶端連接的持久性和復(fù)用,
(2)http.ClientRequest:當(dāng) http.request() 或 http.get() 被調(diào)用時(shí),會(huì)創(chuàng)建 http.ClientRequest 對(duì)象璧诵。
(3)http.Server:當(dāng)使用 http.createServer() 創(chuàng)建新的服務(wù)器時(shí)汰蜘,通常會(huì)實(shí)例化并返回此類。
(4)http.ServerResponse
(5)http.IncomingMessage:http.serverRqueste()

http.serve的事件
http.server是一個(gè)基于事件的http服務(wù)器之宿,所有請(qǐng)求都被封裝成獨(dú)立的事件族操,開(kāi)發(fā)者只有對(duì)它的事件編寫相應(yīng)函數(shù),實(shí)現(xiàn)http服務(wù)器的所有功能比被。它繼承于EventEmitter色难,提供了以下事件:

(1)request:當(dāng)客戶端請(qǐng)求到來(lái)時(shí),該事件被觸發(fā)等缀,提供兩個(gè)參數(shù)req和res枷莉,分別是http.ServerRequest和http.IncomingMessage(http.ServerResponse)的實(shí)例,表示請(qǐng)求和響應(yīng)信息尺迂;就是我們常用的http.createServer([requestListener])模塊笤妙;
(2)connection:當(dāng)TCP連接建立時(shí),該事件被觸發(fā)噪裕,提供一個(gè)參數(shù)socket蹲盘,為net.Socket的實(shí)例(底層協(xié)議底下)
(3)close:當(dāng)服務(wù)器關(guān)閉時(shí),該事件被觸發(fā)膳音,除此之外還有checkContinue召衔、upgrade、clientError事件
(4)listen()啟動(dòng)服務(wù)器監(jiān)聽(tīng)
server.listen(prot,host,backlog,callback) 啟動(dòng)服務(wù)器監(jiān)聽(tīng)
port:監(jiān)聽(tīng)的端口號(hào)祭陷,0表示為服務(wù)器隨機(jī)分配一個(gè)端口號(hào)薄嫡。
host:監(jiān)聽(tīng)的地址,默認(rèn)為本機(jī)(localhost)
backlog:指定位于等待隊(duì)列中的客戶端連接的最大數(shù)量颗胡。超過(guò)此數(shù)量毫深,則服務(wù)器拒絕新的客戶端請(qǐng)求。
callback:開(kāi)啟監(jiān)聽(tīng)后觸發(fā)的回調(diào)函數(shù)毒姨。當(dāng)服務(wù)器開(kāi)啟監(jiān)聽(tīng)后會(huì)觸發(fā)listening事件哑蔫,可以通過(guò)監(jiān)聽(tīng)listening事件來(lái)代替callback回調(diào)函數(shù)。

  1. 創(chuàng)建服務(wù)器

const http = require('http'); // 1.導(dǎo)入 http 模塊弧呐。
const server = http.createServer(); // 2.創(chuàng)建 web 服務(wù)器實(shí)例闸迷。

server.on('request', function(req, res) { // 3.為服務(wù)器實(shí)例綁定 request 事件,監(jiān)聽(tīng)客戶端請(qǐng)求俘枫。
console.log('someone visit our web server');
});

server.listen(8080, function() { // 4.啟動(dòng)服務(wù)器監(jiān)聽(tīng)
console.log('server runing at http://127.0.0.1:8080');
});

server.on("connection",function(socket){ //客戶端與服務(wù)器創(chuàng)立鏈接時(shí)觸發(fā)connection事件 }); //監(jiān)聽(tīng)服務(wù)器連接

2. http.IncomingMessage(http.Serverrequest)(請(qǐng)求的信息)
這部分主要包括請(qǐng)求頭的設(shè)置(常用跨域設(shè)置)腥沽,和請(qǐng)求參數(shù)的獲取鸠蚪;

http請(qǐng)求分為兩部分:請(qǐng)求頭和請(qǐng)求體今阳。
請(qǐng)求內(nèi)容端的直接在請(qǐng)求頭解析完成后立即讀取师溅,而請(qǐng)求體可能相對(duì)較長(zhǎng),需要一定的事件傳輸盾舌,因?yàn)樘峁┝巳齻€(gè)事件用于控制請(qǐng)求體傳輸:
(1)data:當(dāng)請(qǐng)求體數(shù)據(jù)到來(lái)時(shí)墓臭,該事件被觸發(fā),該事件只有一個(gè)參數(shù)chunk妖谴,表示接受到的數(shù)據(jù)
(2)end:當(dāng)請(qǐng)求體數(shù)據(jù)傳輸完成時(shí)窿锉,該事件被觸發(fā),此后將不會(huì)再有數(shù)據(jù)的到來(lái)膝舅,必須被調(diào)用嗡载。
(3)close:當(dāng)前用戶請(qǐng)求結(jié)束時(shí),該事件被觸發(fā)仍稀,不同于end洼滚,如果用戶強(qiáng)制終止了傳輸,也會(huì)觸發(fā)close

request常用屬性:
request.method:請(qǐng)求的方式琳轿,值為GET/POST/PUT/DELETE
request.url:獲取請(qǐng)求url判沟,常與url模塊解析耿芹,url.parse(request.url)崭篡。
request.headers:HTTP請(qǐng)求頭
request.trails:HTTP請(qǐng)求尾(不常見(jiàn))
request.httpVersion:客戶端發(fā)送的HTTP版本(通常是1.0/1.1)
request.railers:客戶端發(fā)送的trailers對(duì)象信息。只有IncommingMessage對(duì)象的end事件觸發(fā)后才能讀取到該信息吧秕。
request.complete:客戶端請(qǐng)求是否已經(jīng)發(fā)送完成
request.connection: 當(dāng)前http連接套間字琉闪,為net.Socket的實(shí)例
request.socket:connection屬性的別名
request.client:client屬性的別名

獲取get請(qǐng)求信息(請(qǐng)求頭)
params = url.parse(req.url, true).query; //urls為nodejs的模塊,需引入砸彬;第二個(gè)參數(shù)默認(rèn)為false,設(shè)置成ture后颠毙,會(huì)返回query的對(duì)象

獲取post請(qǐng)求信息(請(qǐng)求體)
//注冊(cè)data事件監(jiān)聽(tīng)函數(shù),每當(dāng)接受請(qǐng)求體的數(shù)據(jù)砂碉,
const body='';
request.on('data',function(chunk){
body += chunk;
});

req.on('end',function(){
Const body = querystring.parse(body); //解析成真正的body請(qǐng)求格式,獲取的是post的body的參數(shù)蛀蜜;
res.end(); //
});

備注:獲取url,參數(shù)常用模塊
var urls = require('url');提供url的解析方法
var querystring = require('querystring');post參數(shù)轉(zhuǎn)換
var util = require('util');提供格式化json的方法

3. http.ServerResponse(返回給客戶端的信息)
定義用戶得到的結(jié)果,包括響應(yīng)頭和響應(yīng)數(shù)據(jù)設(shè)置

常用函數(shù)
res.writeHead(statusCode,[heasers]):向請(qǐng)求的客戶端發(fā)送響應(yīng)頭增蹭,該函數(shù)在一個(gè)請(qǐng)求中最多調(diào)用一次滴某,如果不調(diào)用,則會(huì)自動(dòng)生成一個(gè)響應(yīng)頭
res.write(data,[encoding]):想請(qǐng)求的客戶端發(fā)送相應(yīng)內(nèi)容滋迈,data是一個(gè)buffer或者字符串霎奢,如果data是字符串,則需要制定編碼方式饼灿,默認(rèn)為utf-8幕侠,在res.end調(diào)用之前可以多次調(diào)用
res.end([data],[encoding]):結(jié)束響應(yīng),告知客戶端所有發(fā)送已經(jīng)結(jié)束碍彭,當(dāng)所有要返回的內(nèi)容發(fā)送完畢時(shí)晤硕,該函數(shù)必需被調(diào)用一次悼潭,兩個(gè)可選參數(shù)與res.write()相同。如果不調(diào)用這個(gè)函數(shù)窗骑,客戶端將用于處于等待狀態(tài)女责。

response.writeHead(statusCode, [headers]:向請(qǐng)求的客戶端發(fā)送響應(yīng)頭
  ——Statuscode是http的狀態(tài)碼,如200為成功创译,404未找到等
  ——headers是一個(gè)類似關(guān)聯(lián)數(shù)組的對(duì)象抵知,表示響應(yīng)頭的每個(gè)屬性
備注:
headers:響應(yīng)頭對(duì)象:常用字段如下:

1、Content-Type:指定返回內(nèi)容類型

2软族、location:將客戶端重定向到另一個(gè)URL地址刷喜。

3、content-disposition:指定一個(gè)被下載的文件名立砸。

4掖疮、content-length:指定響應(yīng)內(nèi)容的字節(jié)數(shù)。

5颗祝、set-cookie:在客戶端創(chuàng)建的cookie浊闪。

6、content-encodinig:指定服務(wù)器響應(yīng)的內(nèi)容的編碼格式螺戳。

7搁宾、Cache-Control:用于開(kāi)啟緩存機(jī)制。

8倔幼、Expires:指定緩存過(guò)期時(shí)間盖腿。

9、Etag:指定服務(wù)器響應(yīng)內(nèi)容沒(méi)有變化時(shí)不重新下載數(shù)據(jù)损同。

10翩腐、Access-Control-Allow-Origin: 設(shè)定允許跨域操作,值為允許想服務(wù)器請(qǐng)求數(shù)據(jù)的域名+端口號(hào)

//單獨(dú)設(shè)置響應(yīng)頭膏燃,name: 響應(yīng)字段名 value:響應(yīng)字段對(duì)象的值(通過(guò)數(shù)組可以指定多個(gè)字段值)茂卦。
response.setHeader(name,value);
response.getHeader(name) //獲取設(shè)置的響應(yīng)頭
response.removeHeader(name); //移除已設(shè)置的響應(yīng)頭信息

response.write(data,[encoding]):向請(qǐng)求客戶端發(fā)送響應(yīng)內(nèi)容
  ——data是buffer或字符串,
  ——encoding為編碼组哩,默認(rèn)字符串的編碼格式為"utf8"等龙;

備注:
(1)當(dāng)使用write方法發(fā)送數(shù)據(jù)時(shí),如果之前沒(méi)有調(diào)用writeHead方法禁炒,則Node.js會(huì)隱式調(diào)用該方法而咆。
(2)response.write方法返回一個(gè)布爾類型值:當(dāng)Node.js直接將數(shù)據(jù)發(fā)送到操作系統(tǒng)的內(nèi)核緩存區(qū)中時(shí),返回true(網(wǎng)絡(luò)較好的情況時(shí)幕袱,服務(wù)器和客戶端收發(fā)數(shù)據(jù)比較流暢)暴备,當(dāng)先把數(shù)據(jù)緩存到Node.js設(shè)置的緩存區(qū)中時(shí)返回false(適用于服務(wù)器和客戶端的收發(fā)速度不一致的情況,一般指客戶端接收數(shù)據(jù)跟不上服務(wù)器的發(fā)送速度们豌。這樣Node.js先把數(shù)據(jù)緩存起來(lái)涯捻,等客戶端接收完之前緩存在操作系統(tǒng)內(nèi)核緩存區(qū)的數(shù)據(jù)時(shí)浅妆,再將數(shù)據(jù)發(fā)送到操作系統(tǒng)內(nèi)核緩存區(qū)。)

response.end([data],[encoding]):響應(yīng)結(jié)束障癌,告知用戶所有發(fā)送已經(jīng)完成凌外,當(dāng)所有要返回的內(nèi)容發(fā)送完畢,該函數(shù)必須被調(diào)用一次涛浙,如果不調(diào)用康辑,客戶端永遠(yuǎn)處于等待的狀態(tài)

備注:
res.setHeader('Content-Type', 'text/html;charset=utf-8') //可以防止中英文亂碼
response.setTimeout(msec,[callback]); //設(shè)置響應(yīng)超時(shí)
response.on("timeout",function(){ //超時(shí)處理代碼 }); //服務(wù)器響應(yīng)超時(shí)時(shí)間
response.on("close",function(){ //連接中斷處理事件});//在執(zhí)行end之前端口連接,觸發(fā)該事件轿亮;
Response.Flush() 將緩存中的內(nèi)容立即顯示出來(lái),然后再執(zhí)行后面的語(yǔ)句
reaponse.write(). //向客戶端返回?cái)?shù)據(jù)疮薇,可以多次調(diào)用,必須調(diào)用end()結(jié)束服務(wù)
response.end() //結(jié)束請(qǐng)求我注,也可以向客戶端響應(yīng)一些內(nèi)容按咒。參數(shù)只限定字符串和Buffer

response.send()。// 參數(shù)可以是Buffer對(duì)象但骨,String励七,對(duì)象或Array,傳入number是沒(méi)反應(yīng)的奔缠。 在服務(wù)器里面直接使用會(huì)報(bào)錯(cuò)

4. http.ClientRequest
使用http的request方法可以向其他服務(wù)器發(fā)送請(qǐng)求掠抬,類是于axios;
http.request():發(fā)送http請(qǐng)求道服務(wù)器,創(chuàng)建http.ClientRequest類的實(shí)例
http.get():類似于http.request()添坊,但會(huì)自動(dòng)地設(shè)置 HTTP 方法為 GET剿另,并自動(dòng)地調(diào)用 req.end()箫锤。
(4)socket:服務(wù)器端監(jiān)聽(tīng)客戶端請(qǐng)求的socket對(duì)象

const req = http.request(options,callback);
options:對(duì)象或者字符串贬蛙,如果為字符串的話,表示要請(qǐng)求的URL地址谚攒。如果為對(duì)象的話阳准,對(duì)象的屬性包括以下信息:

host:要請(qǐng)求的域名或主機(jī)IP地址。
hostname:同host馏臭,優(yōu)先級(jí)高于host(同時(shí)存在host和hostname會(huì)優(yōu)先使用hostname)野蝇。
port:目標(biāo)服務(wù)器的端口號(hào)。
localAddress:用于網(wǎng)絡(luò)連接的本地接口括儒。
socketPath: 指定目標(biāo)Unix域端口绕沈。
method:請(qǐng)求方式。
path:請(qǐng)求路徑及查詢字符串帮寻,默認(rèn)為/
header:請(qǐng)求時(shí)發(fā)送的慶丘頭對(duì)象乍狐。
auth: 認(rèn)證信息部分。

callback:獲取目標(biāo)網(wǎng)站所返回的響應(yīng)流時(shí)調(diào)用的回調(diào)函數(shù)固逗,原型為:

使用get方式向服務(wù)器發(fā)送數(shù)據(jù)
get方式和request方式區(qū)別為:request請(qǐng)求方式需要指定請(qǐng)求方式為get方式浅蚪,并且數(shù)據(jù)發(fā)送結(jié)束后需要調(diào)用end方式終止響應(yīng)藕帜,get方式結(jié)束數(shù)據(jù)發(fā)送時(shí)不需要調(diào)用end方法,Node.js默認(rèn)調(diào)用惜傲。函數(shù)原型為:

5. Agent類:連接管理洽故,獲取連接數(shù)據(jù)
http.globalAgent:指向Agent對(duì)象的全局實(shí)例,用來(lái)管理http客戶端連接的持久性和復(fù)用性盗誊;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末时甚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子哈踱,更是在濱河造成了極大的恐慌撞秋,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚣鄙,死亡現(xiàn)場(chǎng)離奇詭異吻贿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)哑子,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門舅列,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人卧蜓,你說(shuō)我怎么就攤上這事帐要。” “怎么了弥奸?”我有些...
    開(kāi)封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵榨惠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我盛霎,道長(zhǎng)赠橙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任愤炸,我火速辦了婚禮期揪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘规个。我一直安慰自己凤薛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布诞仓。 她就那樣靜靜地躺著缤苫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪墅拭。 梳的紋絲不亂的頭發(fā)上活玲,一...
    開(kāi)封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼翼虫。 笑死屑柔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的珍剑。 我是一名探鬼主播掸宛,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼招拙!你這毒婦竟也來(lái)了唧瘾?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤别凤,失蹤者是張志新(化名)和其女友劉穎饰序,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體规哪,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡求豫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诉稍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝠嘉。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖杯巨,靈堂內(nèi)的尸體忽然破棺而出蚤告,到底是詐尸還是另有隱情,我是刑警寧澤服爷,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布杜恰,位于F島的核電站,受9級(jí)特大地震影響仍源,放射性物質(zhì)發(fā)生泄漏心褐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一镜会、第九天 我趴在偏房一處隱蔽的房頂上張望檬寂。 院中可真熱鬧终抽,春花似錦戳表、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至圃郊,卻和暖如春价涝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背持舆。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工色瘩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伪窖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓居兆,卻偏偏與公主長(zhǎng)得像覆山,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泥栖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容