HTTP 協議
HTTP 是一種在客戶端和服務器之間編碼和傳輸數據的方法。
它是一個請求/響應協議:客戶端和服務端針對相關內容和完成狀態信息的請求和響應。
HTTP 是獨立的,允許請求和響應流經許多執行負載均衡,緩存,加密和壓縮的中間路由器和服務器。
一個基本的 HTTP 請求由一個動詞(方法)和一個資源(端點)組成。
HTTP 是依賴于較低級協議(如 TCP 和 UDP)的應用層協議。
HTTP請求
發送HTTP請求的過程就是構建HTTP請求報文并通過TCP協議中發送到服務器指定端口(HTTP協議80/8080, HTTPS協議443)。
HTTP請求報文是由三部分組成:
- 請求行
- 請求報頭 Header
- 請求正文
請求行
格式如下:
Method Request-URL HTTP-Version CRLF
例如 GET /index.html HTTP1.1
常用的方法有: GET, POST, PUT, DELETE, OPTIONS(返回請求的資源所支持的方法), HEAD(僅請求響應首部)。
請求頭信息 Request Header
請求報頭允許客戶端向服務器傳遞請求的附加信息和客戶端自身的信息。
客戶端不一定特指瀏覽器,有時候也可使用Linux下的CURL命令以及HTTP客戶端測試工具等。
常見的請求報頭有:
- Accept:指定客戶端用于接受哪些類型的信息
- Accept-Charset
- Accept-Encoding:指定客戶端接受的編碼方式
- Accept-Language
- Content-Type
- Authorization:客戶端提供給服務器的認證信息
- Cookie:每次請求時都會攜帶上 Cookie 以方便服務器端識別是否是同一個客戶端
- Connection:設置為 keep-alive 用于告訴客戶端本次HTTP請求結束之后并不需要關閉TCP連接,這樣可以使下次HTTP請求使用相同的TCP通道,節省TCP連接建立的時間
- User-Agent:用戶代理,一般情況是瀏覽器,也有其他類型
請求正文
當使用POST, PUT等方法時,通常需要客戶端向服務器傳遞數據。
這些數據就儲存在請求正文中。在請求包頭中有一些與請求正文相關的信息,例如: 現在的Web應用通常采用 Restful 架構,請求的數據格式一般為json。這時就需要設置 Content-Type: application/json
。
HTTP響應
HTTP響應報文也是由三部分組成:
- 狀態碼
- 響應報頭
- 響應報文
狀態碼
狀態碼是由3位數組成,第一個數字定義了響應的類別,且有五種可能取值:
- 1xx:指示信息–表示請求已接收,繼續處理
- 2xx:成功–表示請求已被成功接收、理解、接受
- 3xx:重定向–要完成請求必須進行更進一步的操作
- 4xx:客戶端錯誤–請求有語法錯誤或請求無法實現
- 5xx:服務器端錯誤–服務器未能實現合法的請求
例如 HTTP 1.1 200 OK
(即版本號 + 狀態碼)
響應報頭 Response Header
響應報文
服務器返回給瀏覽器的文本信息,通常HTML, CSS, JS, 圖片等文件就放在這一部分。
HTTP header中的 Cache-control
網頁的緩存是由HTTP消息頭中的 Cache-control
來控制的,常見的取值有private、no-cache、max-age、must-revalidate等,默認為private。其作用根據不同的重新瀏覽方式分為以下幾種情況:
打開新窗口
如果指定Cache-control
的值為private、no-cache、must-revalidate,那么打開新窗口訪問時都會重新訪問服務器。而如果指定了max-age值,那么在此值內的時間里就不會重新訪問服務器,例如:Cache-control: max-age=5
表示當訪問此網頁后的5秒內再次訪問不會去服務器。在地址欄回車
如果指定Cache-control
的值為private或must-revalidate,則只有第一次訪問時會訪問服務器,以后就不再訪問。如果值為no-cache,那么每次都會訪問。如果值為max-age,則在過期之前不會重復訪問。按后退按扭
如果指定Cache-control
的值為private、must-revalidate、max-age,則不會重訪問,而如果為no-cache,則每次都重復訪問按刷新按扭
無論為何值,都會重復訪問
當指定Cache-control值為“no-cache”時,訪問此頁面不會在Internet臨時文件夾留下頁面備份。