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