天天看點

基礎知識:HTTP協定以及GET請求和POST請求的差別

對于HTTP協定,做Web程式設計的開發人員再熟悉不過了。 不論是前端Html頁面通過Ajax還是用戶端通過 HttpClient 又或服務端與服務端之間的Rest請求,這都需要通過Http協定完成請求 。在HTTP協定中,我們最常用的是GET和POST請求,對于這兩個方法,應該是最基礎的東西。但是,兩者的差別以及使用場景一直是大家經常讨論的問題,也是在面試中經常被問到的問題。 本文将詳細介紹HTTP協定以及GET和POST方法的差別和使用場景。

HTTP協定概念以及版本

HTTP是一個屬于應用層的面向對象的協定,由于其簡捷、快速的方式,非常适用于分布式超媒體資訊系統。 HTTP經曆了HTTP\0.9、HTTP\1.0、HTTP\1.1和HTTP\2.0的版本 ,其中,HTTP\0.9是最早的HTTP協定,目前已經廢棄 。 HTTP\1.0最早使用在簡單的網頁和網絡和請求上。HTTP\1.1釋出于1999年, 增加了緩存處理、帶寬優化及網絡連接配接的使用、錯誤通知的管理、Host頭處理、長連接配接等功能 , 這些優點使得HTTP\1.1得到了廣泛的使用,它是目前使用最廣泛的協定。

一個完整的HTTP請求資料主要包括請求行、請求頭部、請求包體 ,如下圖所示:

基礎知識:HTTP協定以及GET請求和POST請求的差別

 HTTP響應資料主要包括狀态行、消息報頭、響應正文 ,下圖所示:

基礎知識:HTTP協定以及GET請求和POST請求的差別
基礎知識:HTTP協定以及GET請求和POST請求的差別

HTTP支援的方法

HTTP\0.9版本中隻有GET和POST兩種方法。HTTP\1.0中有三種方法:GET、POST和HEAD。HTTP1\.1中增加到了八種方法 ,分别為:

  • GET :請求指定的url,擷取響應内容。GET方法多用來擷取内容而不是送出内容。因為GET方法會暴露請求參數,這是一種不安全的方法。
  • POST :向指定url送出資料,例如form表單送出、檔案上傳等。
  • HEAD :請求指定url,擷取響應的頭資訊。 HEAD請求時,服務端并不會傳回響應的主體資料,多用于client檢視服務端的性能 。
  • PUT :與POST方法類似,用來送出資料。差別是PUT方法是幂等的,用來送出全部資訊。(主要是語義上的差別)
  • DELETE :删除請求url所辨別的資源。
  • OPTION :一般随POST方法一起發起(先于POST)。用來擷取服務端所支援的方法。 在跨域請求的時候,OPTION請求會先發,用來檢測該url是否具有權限通路資源 。
  • TRACE :使用者測試HTTP請求,服務端會回應要求的資訊。
  • CONNECT :HTTP\1.1預留的方法。多用于SSL加密伺服器的連結。

GET方法和POST方法的差別

HTTP\1.1的八種方法中,最常用的還是GET和POST方法 。GET和POST方法的使用場景不同,兩者之間有很多不同。這些不同點主要展現在什麼地方呢?

  • 1、參數傳遞的方式不同

GET方法請求的時候, 參數會拼接到URL的後面,參數之間以&相連 ,如:login.php?username=xx&password=x,請求參數會暴露在浏覽器中,是以是一種不安全的請求方式,多用來擷取資料。

POST方法請求的時候,參數會放到HTTP的請求體中,對于使用者是不可見的,如下圖所示:

基礎知識:HTTP協定以及GET請求和POST請求的差別

雖然請求參數對于使用者是不可見的,但是對于浏覽器而言任然是可見的。 我們可以通過浏覽器的開發者模式檢視POST的請求體, 是以POST方法也是不安全的。

  • 2、URL長度不同

嚴格來說,GET方法和POST方法的請求參數長度都是沒有限制的, HTTP協定中并沒有規定參數的長度 。但是,在浏覽器和WEB容器中有限制,主要是為了提高URL解析的效率。一般浏覽器規定GET請求的時候, URL長度不能大于2000個字元,POST請求的資料不能大于4M 。當然不同的浏覽器和伺服器限制條件不同,可以參照下圖:

基礎知識:HTTP協定以及GET請求和POST請求的差別

是以,為了相容大多數的浏覽器和伺服器,URL參數保證在2000個字元以内 ,這樣,對于伺服器的壓力也小,可以提升系統的性能。

  • 3、安全性不同

GET方法的請求的時候,參數暴露在浏覽器中,使用者可以明顯的看到參數,這是不安全的請求方式。

POST請求的時候,參數随請求體傳遞。POST方法相對GET方法安全一些,但不是絕對的。通過抓包方式也是可以檢視POST的請求參數的。

  • 4、資料包不同

GET請求的時候,産生一個 TCP 資料包。 請求的 header 和data一起發送出去,服務端返響應具體的狀态碼。

總結

繼續閱讀