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ù)。
- 創(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ù)用性盗誊;