Post,Get介面傻傻分不清?

time911發表於2018-12-10

Post,Get介面傻傻分不清?

引言

幾天前和後端同事探討介面問題。起因是他給我一個不需要任何資料提交,單純得到資料的Post介面。引發了我對Post,Get介面的思考。
Post,Get介面是我們最常使用的介面。那麼那些似乎約定俗成的規則又是怎麼來的呢? 他們究竟哪裡不同?
下面讓我們一探究竟吧。

介面簡介

http協議是基於tcp協議的應用層協議,tcp協議作為可靠的傳輸層協議,因此http協議也是可靠的。日常開發過程中,最常用的是get post put delete,在http協議的規定中,這四個method屬於標準的crud,分別代表了增刪改查,存在著語義上的差別。

  1. GET請求會向資料庫發索取資料的請求,從而來獲取資訊,該請求就像資料庫的select操作一樣,只是用來查詢一下資料,不會修改、增加資料,不會影響資源的內容,即該請求不會產生副作用。無論進行多少次操作,結果都是一樣的。

  2. PUT請求是向伺服器端傳送資料的,從而改變資訊,該請求就像資料庫的update操作一樣,用來修改資料的內容,但是不會增加資料的種類等,也就是說無論進行多少次PUT操作,其結果並沒有不同。

  3. POST請求同PUT請求類似,都是向伺服器端傳送資料的,但是該請求會改變資料的種類等資源,就像資料庫的insert操作一樣,會建立新的內容。幾乎目前所有的提交操作都是用POST請求的。

  4. DELETE請求顧名思義,就是用來刪除某一個資源的,該請求就像資料庫的delete操作。

簡單對比

  1. GET在瀏覽器回退時是無害的,而POST會再次提交請求。
  2. GET產生的URL地址可以被Bookmark,而POST不可以。
  3. GET請求會被瀏覽器主動cache,而POST不會,除非手動設定
  4. GET請求的引數會完整的被儲存在歷史記錄裡,POST不會。
  5. GET請求引數放在URL中,POST放在request body中。
  6. GET請求只能進行url編碼,POST請求支援多種編碼方式。
  7. 對於引數型別,GET只接受ASCII字元,而POST沒有限制。
  8. GET請求在URL中傳遞的引數是有長度限制的(理論上就是url的長度),而POST沒有。

主要對比點

其實我們平時工作最多的是使用Post,Get請求。最容易產生歧義的也是這兩個介面。因為兩個介面往往可以達到一樣的效果,所以有些小夥伴就認為他們是一樣的。

那我們就對比一下兩者的區別:

根據HTTP規範,GET用於資訊獲取,而且應該是安全的,冪等的,可快取的。

根據HTTP規範,POST表示可能修改變伺服器上的資源的請求。

  • 【安全-safe】 此“安全”非彼安全。這裡的安全指的是一個方法在本質上是隻讀的,那麼就是安全的。客戶端向服務端的資源發起的請求如果使用了是安全的方法,就不應該引起服務端任何的狀態變化,因此也是無害的。
  • 【冪等-Idempotent】冪等的意思是指一個請求方法執行一次和多次的效果完全相同。
  • 【可快取-Cacheable】可快取性顧名思義就是一個方法是否可被快取。在RFC裡某些情況下的GET,POST都是可快取的。但是絕大部分瀏覽器僅僅支援GET快取。
  • 更多請參看RFC7234

深層對比點

GET和POST本質上都是TCP連結,並無差別。由於HTTP的規定和瀏覽器的限制,導致他們在使用時體現出一些不同。

簡單來說:

GET產生一個TCP資料包,POST產生兩個資料包。對於GET請求來說,瀏覽器會把HTTP header和data一併傳送出去,伺服器相應200即返回資料。

對於POST來說,瀏覽器會先傳送header,伺服器相應100 continue,瀏覽器再傳送data,伺服器相應200返回資料。

下期預告

axios使用說明書,敬請期待。

相關文章