1.HTTP協定
1.1 HTTP協定的特點
無論是POST還是GET請求,都是基于超文本傳輸協定(HTTP)的,而HTTP協定是TCP/IP協定族的應用層協定。
HTTP協定用戶端請求request消息包括以下格式:
請求行(request line)、請求頭部(header)、空行、請求資料

服務端響應response也由四個部分組成,分别是:
- http響應行
- http響應頭
- 空行
- http響應體
1.2 請求方法
HTTP協定定義了多種請求方式,具體如下:
GET
:擷取資源,用來請求通路已被URI(統一資源标志符,和URL是包含和被包含的關系)識别的資源。
POST
:用來傳輸實體的主體,雖然GET也可以實作,但是一般不用。
PUT
:傳輸檔案。但是鑒于PUT方法自身不帶驗證機制,任何人都可以上傳檔案,存在安全性問題,是以一般網站都不采用該方法。
HEAD
:獲得封包首部。和GET請求一樣,隻是不傳回封包主體部分。
DELETE
:删除檔案。同樣不帶驗證機制,存在安全性問題。
OPTIONS
:詢問指定的請求URI支援哪些方法。
TRACE
:追蹤路徑,讓Web伺服器将之前的請求通信環回給用戶端的方法。
CONNECT
:要求在與代理伺服器通信時建立隧道,實作隧道協定進行TCP通信。
2 POST和GET請求差別的常見誤區
2.1 請求參數長度限制:GET請求長度最多1024kb,POST對請求資料沒有限制**
關于此點,在HTTP協定中沒有對URL長度進行限制,這個限制是不同的浏覽器及伺服器由于有不同的規範而帶來的限制。
2.2 GET請求一定不能用request body傳輸資料**
GET可以帶request body,但不能保證一定能被接收到。如果你用GET服務,在request body偷偷藏了資料,不同伺服器的處理方式也是不同的,有些伺服器會幫你讀出資料,有些伺服器直接忽略。
2.3 POST比GET安全性要高**
這裡的安全是相對性,通過GET送出的資料都将顯示到URL上,頁面會被浏覽器緩存,其他人檢視曆史記錄會看到送出的資料,而POST不會。另外GET送出資料還可能會造成CSRF攻擊。
2.4 GET産生一個TCP資料包,POST産生兩個TCP資料包**
對于GET方式的請求,浏覽器會把http header和data一并發送出去,伺服器響應200 OK(傳回資料);而對于POST,浏覽器先發送header,伺服器響應100 continue,浏覽器再發送data,伺服器響應200 OK(傳回資料)。注意,
盡管POST請求會分兩次,但body 是緊随在 header 後面發送的,根本不存在『等待伺服器響應』一說
。
3 POST和GET請求的差別小結
- 請求參數:GET請求參數是通過URL傳遞的,多個參數以&連接配接,POST請求放在request body中。
- 請求緩存:GET請求會被緩存,而POST請求不會,除非手動設定。
- 收藏為書簽:GET請求支援,POST請求不支援。
- 安全性:POST比GET安全,GET請求在浏覽器回退時是無害的,而POST會再次請求。
- 曆史記錄:GET請求參數會被完整保留在浏覽曆史記錄裡,而POST中的參數不會被保留。
- 編碼方式:GET請求隻能進行url編碼,而POST支援多種編碼方式。
- 對參數的資料類型:GET隻接受ASCII字元,而POST沒有限制。