Post,Get介面傻傻分不清?
引言
幾天前和後端同事探討介面問題。起因是他給我一個不需要任何資料提交,單純得到資料的Post介面。引發了我對Post,Get介面的思考。
Post,Get介面是我們最常使用的介面。那麼那些似乎約定俗成的規則又是怎麼來的呢?
他們究竟哪裡不同?
下面讓我們一探究竟吧。
介面簡介
http協議是基於tcp協議的應用層協議,tcp協議作為可靠的傳輸層協議,因此http協議也是可靠的。日常開發過程中,最常用的是get post put delete,在http協議的規定中,這四個method屬於標準的crud,分別代表了增刪改查,存在著語義上的差別。
-
GET請求會向資料庫發索取資料的請求,從而來獲取資訊,該請求就像資料庫的select操作一樣,只是用來查詢一下資料,不會修改、增加資料,不會影響資源的內容,即該請求不會產生副作用。無論進行多少次操作,結果都是一樣的。
-
PUT請求是向伺服器端傳送資料的,從而改變資訊,該請求就像資料庫的update操作一樣,用來修改資料的內容,但是不會增加資料的種類等,也就是說無論進行多少次PUT操作,其結果並沒有不同。
-
POST請求同PUT請求類似,都是向伺服器端傳送資料的,但是該請求會改變資料的種類等資源,就像資料庫的insert操作一樣,會建立新的內容。幾乎目前所有的提交操作都是用POST請求的。
-
DELETE請求顧名思義,就是用來刪除某一個資源的,該請求就像資料庫的delete操作。
簡單對比
- GET在瀏覽器回退時是無害的,而POST會再次提交請求。
- GET產生的URL地址可以被Bookmark,而POST不可以。
- GET請求會被瀏覽器主動cache,而POST不會,除非手動設定
- GET請求的引數會完整的被儲存在歷史記錄裡,POST不會。
- GET請求引數放在URL中,POST放在request body中。
- GET請求只能進行url編碼,POST請求支援多種編碼方式。
- 對於引數型別,GET只接受ASCII字元,而POST沒有限制。
- 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使用說明書,敬請期待。