Nodejs之http模块详解
一、Web服務(wù)器
什么是Web服務(wù)器?
當(dāng)應(yīng)用程序(客戶端)需要某一個(gè)資源時(shí),可以向一個(gè)臺(tái)服務(wù)器,通過(guò)Http請(qǐng)求獲取到這個(gè)資源;提供資源的這個(gè)服務(wù)器,就是一個(gè)Web服務(wù)器;
目前有很多開(kāi)源的Web服務(wù)器:Nginx、Apache(靜態(tài))、Apache Tomcat(靜態(tài)、動(dòng)態(tài))、Node.js
二、Web服務(wù)器初體驗(yàn)
三、創(chuàng)建服務(wù)器的方式
創(chuàng)建服務(wù)器對(duì)象,我們是通過(guò) createServer 來(lái)完成的
- http.createServer會(huì)返回服務(wù)器的對(duì)象;
- 底層其實(shí)使用直接 new Server 對(duì)象。
那么,當(dāng)然,我們也可以自己來(lái)創(chuàng)建這個(gè)對(duì)象:
上面我們已經(jīng)看到,創(chuàng)建Server時(shí)會(huì)傳入一個(gè)回調(diào)函數(shù),這個(gè)回調(diào)函數(shù)在
被調(diào)用時(shí)會(huì)傳入兩個(gè)參數(shù):
四、監(jiān)聽(tīng)主機(jī)和端口號(hào)
Server通過(guò)listen方法來(lái)開(kāi)啟服務(wù)器,并且在某一個(gè)主機(jī)和端口上監(jiān)聽(tīng)網(wǎng)絡(luò)請(qǐng)求:
也就是當(dāng)我們通過(guò) ip:port的方式發(fā)送到我們監(jiān)聽(tīng)的Web服務(wù)器上時(shí);我們就可以對(duì)其進(jìn)行相關(guān)的處理;
listen函數(shù)有三個(gè)參數(shù):
- localhost:本質(zhì)上是一個(gè)域名,通常情況下會(huì)被解析成127.0.0.1;
- 127.0.0.1:回環(huán)地址(Loop Back Address),表達(dá)的意思其實(shí)是我們主機(jī)自己發(fā)出去的包,直接被自己接收;
正常的數(shù)據(jù)庫(kù)包經(jīng)常 應(yīng)用層 - 傳輸層 - 網(wǎng)絡(luò)層 - 數(shù)據(jù)鏈路層 - 物理層 ;
而回環(huán)地址,是在網(wǎng)絡(luò)層直接就被獲取到了,是不會(huì)經(jīng)常數(shù)據(jù)鏈路層和物理層的;
比如我們監(jiān)聽(tīng) 127.0.0.1時(shí),在同一個(gè)網(wǎng)段下的主機(jī)中,通過(guò)ip地址是不能訪問(wèn)的; - 0.0.0.0: ü 監(jiān)聽(tīng)I(yíng)PV4上所有的地址,再根據(jù)端口找到不同的應(yīng)用程序;
比如我們監(jiān)聽(tīng) 0.0.0.0時(shí),在同一個(gè)網(wǎng)段下的主機(jī)中,通過(guò)ip地址是可以訪問(wèn)的;
五、request對(duì)象
在向服務(wù)器發(fā)送請(qǐng)求時(shí),我們會(huì)攜帶很多信息,比如:
- 本次請(qǐng)求的URL,服務(wù)器需要根據(jù)不同的URL進(jìn)行不同的處理;
- 本次請(qǐng)求的請(qǐng)求方式,比如GET、POST請(qǐng)求傳入的參數(shù)和處理的方式是不同的;
- 本次請(qǐng)求的headers中也會(huì)攜帶一些信息,比如客戶端信息、接受數(shù)據(jù)的格式、支持的編碼格式等;
這些信息,Node會(huì)幫助我們封裝到一個(gè)request的對(duì)象中,我們可以直接來(lái)處理這個(gè)request對(duì)象:
六、URL的處理
客戶端在發(fā)送請(qǐng)求時(shí),會(huì)請(qǐng)求不同的數(shù)據(jù),那么會(huì)傳入不同的請(qǐng)求地址:
- 比如 http://localhost:8000/login;
- 比如 http://localhost:8000/products;
七、URL的解析
那么如果用戶發(fā)送的地址中還攜帶一些額外的參數(shù)呢?
p http://localhost:8000/login?name=why&password=123;
p 這個(gè)時(shí)候,url的值是 /login?name=why&password=123; n 我們?nèi)绾螌?duì)它進(jìn)行解析呢?使用內(nèi)置模塊url:
但是 query 信息如何可以獲取呢?
在我們程序中如何進(jìn)行判斷以及獲取對(duì)應(yīng)的數(shù)據(jù)呢?
- 這里我們需要判斷接口是 /login,并且請(qǐng)求方式是POST方法去獲取傳入的數(shù)據(jù);
- 獲取這種body攜帶的數(shù)據(jù),我們需要通過(guò)監(jiān)聽(tīng)req的 data事件來(lái)獲取;
將JSON字符串格式轉(zhuǎn)成對(duì)象類型,通過(guò)JSON.parse方法即可:
八、headers屬性
在request對(duì)象的header中也包含很多有用的信息,客戶端會(huì)默認(rèn)傳遞過(guò)來(lái)一些信息:
content-type是這次請(qǐng)求攜帶的數(shù)據(jù)的類型:
-
application/json表示是一個(gè)json類型;
-
text/plain表示是文本類型;
-
application/xml表示是xml類型;
-
multipart/form-data表示是上傳文件;
-
content-length:文件的大小和長(zhǎng)度
-
keep-alive:
http是基于TCP協(xié)議的,但是通常在進(jìn)行一次請(qǐng)求和響應(yīng)結(jié)束后會(huì)立刻中斷;
在http1.0中,如果想要繼續(xù)保持連接:
— 瀏覽器需要在請(qǐng)求頭中添加 connection: keep-alive;
— 服務(wù)器需要在響應(yīng)頭中添加 connection:keey-alive;
— 當(dāng)客戶端再次放請(qǐng)求時(shí),就會(huì)使用同一個(gè)連接,直接一方中斷連接; -
在http1.1中,所有連接默認(rèn)是 connection: keep-alive的;
— 不同的Web服務(wù)器會(huì)有不同的保持 keep-alive的時(shí)間;
— Node中默認(rèn)是5s中; -
accept-encoding:告知服務(wù)器,客戶端支持的文件壓縮格式,比如js文件可以使用gzip編碼,對(duì)應(yīng) .gz文件;
-
accept:告知服務(wù)器,客戶端可接受文件的格式類型;
-
user-agent:客戶端相關(guān)的信息;
九、返回響應(yīng)結(jié)果
如果我們希望給客戶端響應(yīng)的結(jié)果數(shù)據(jù),可以通過(guò)兩種方式:
- Write方法:這種方式是直接寫(xiě)出數(shù)據(jù),但是并沒(méi)有關(guān)閉流;
- end方法:這種方式是寫(xiě)出最后的數(shù)據(jù),并且寫(xiě)出后會(huì)關(guān)閉流;
如果我們沒(méi)有調(diào)用 end和close,客戶端將會(huì)一直等待結(jié)果: - 所以客戶端在發(fā)送網(wǎng)絡(luò)請(qǐng)求時(shí),都會(huì)設(shè)置超時(shí)時(shí)間。
十、返回狀態(tài)碼
Http狀態(tài)碼(Http Status Code)是用來(lái)表示Http響應(yīng)狀態(tài)的數(shù)字代碼:
- Http狀態(tài)碼非常多,可以根據(jù)不同的情況,給客戶端返回不同的狀態(tài)碼;
- 常見(jiàn)的狀態(tài)碼是下面這些(后續(xù)項(xiàng)目中,也會(huì)用到其中的狀態(tài)碼);
設(shè)置狀態(tài)碼常見(jiàn)的有兩種方式:
十一、響應(yīng)頭文件
返回頭部信息,主要有兩種方式:
- res.setHeader:一次寫(xiě)入一個(gè)頭部信息;
- res.writeHead:同時(shí)寫(xiě)入header和status;
Header設(shè)置 Content-Type有什么作用呢?
p 默認(rèn)客戶端接收到的是字符串,客戶端會(huì)按照自己默認(rèn)的方式進(jìn)行處理;
十二、http請(qǐng)求
axios庫(kù)可以在瀏覽器中使用,也可以在Node中使用:
- 在瀏覽器中,axios使用的是封裝xhr;
- 在Node中,使用的是http內(nèi)置模塊;
十三、文件上傳 – 錯(cuò)誤示范
如果是一個(gè)很大的文件需要上傳到服務(wù)器端,服務(wù)器端進(jìn)行保存應(yīng)該如何操作呢?
十三、文件上傳 – 正確做法
總結(jié)
以上是生活随笔為你收集整理的Nodejs之http模块详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JS高级——手写call()、apply
- 下一篇: JS数据结构与算法——插入排序