前言
在使用PostMan之前,自己測試Rest介面都是直接在瀏覽器位址列輸入URL來測試的,但是這種方法發出的請求都是Get,如果要傳送POST請求只能用ajax等程式設計方式。有了PostMan就方便多了。某一天在輸URL的時候,突然想看看瀏覽器到底做了什麼,於是就有了下面這些內容。
概述
以下講述的是一個請求靜態網頁檔案的例子,該例子有以下幾個過程:
1.在瀏覽器位址列輸入一個URL,並回車
2.瀏覽器利用DNS,找到域名對應的IP地址
3.瀏覽器與服務端建立socket連線,如果已有則無需建立
4.瀏覽器利用socket連線傳送請求資料包
5.服務端返回響應資料包
6.瀏覽器渲染HTML
7.如果HTML中含有其他檔案的引用,如css,js檔案,那麼它還會重複步驟3~6
建立Socket
要與服務端建立socket連線,瀏覽器要知道哪些資訊呢?
- 伺服器的IP地址
- 應用程式佔用埠。
IP地址怎麼獲取?
首先你輸入要訪問一個網站必然有域名,有了域名必然就能找到IP地址。域名與IP地址是多對一的關係。值得一提的是,域名到IP地址的對映不一定要用到DNS,如果本地hosts檔案中有相關的對映,那就不必遠端查詢了。
位址列就不能直接輸IP地址嗎?
只要你記得住,當然可以輸,還省去了解析域名的麻煩。域名的出現就是為了不用去記IP地址。例如,baidu.com 總比 xxx.xxx.xxx.xxx好記吧。
那埠呢?
埠在URL中是直接跟在IP地址/域名後面,一般是這樣:
IP地址/域名:埠
比如tomcat專案就是,localost:8080/xxx
那為什麼很多網站訪問的時候不需要輸埠?
因為預設不輸入的話,會補上80埠。所以埠還是有的。
傳送請求資料包
請求資料包包含哪些內容?
那就要說到資料包的結構了,HTTP請求報文分三部分,請求行(request line)、請求頭(request headers)、請求實體(request body)。大概就是下面這樣:
Method Uri Protocol/version CRLF
Header1:Value1 CRLF
Header2:Value2 CRLF
....
CRLF
Body
這三大塊用CRLF分隔(CLRF就是回車+換行,即"\r\n")。
接收響應資料包
200、500等這些響應結果是怎麼回事?
你能收到這些響應結果,至少網路是通的。需要明確一點的是,這些狀態碼是服務端寫好,然後發給你的。請求正常就是200,請求引數導致服務程式出現異常就是500等等。這些狀態碼很多,有興趣的可以去看Http協議說明。
網頁資料在哪裡?
網頁檔案的內容都放在響應報文的body中,瀏覽器會把網頁內容渲染到頁面上。
提示下載檔案是怎麼回事?
這其實說的是響應報文對於body內容的處理方式,預設情況下是直接在網頁上展示的。這主要由響應頭中的Content-Disposition值決定,預設是inline,也就是直接在網頁上展示。如果是需要下載的話,那就是attachement;filename=xxx.如果瀏覽器接收到這樣的響應報文,會彈出下載提示框,讓使用者選擇儲存位置。
斷開Socket連線
什麼時候斷開連線?
實際上,Http協議到了1.1之後,預設維持的是長連線,也就是不會關閉。因為如果每個請求都建立新的連線的話,握手的開銷不可小覷。現在基本上使用的都是1.1版本。
怎麼斷開連線?
socket連線只要雙方任何一方關閉即可斷開連線,所以可以是瀏覽器或服務端任意一方關閉連線。
瀏覽器 => 關閉瀏覽器應用 Or 提示服務端,讓服務端關閉,具體方式為新增請求頭Connect:close
服務端 => 程式設計呼叫close方法