Post,Get接口傻傻分不清?

Post,Get接口傻傻分不清?

引言

幾天前和後端同事探討接口問題。原由是他給我一個不須要任何數據提交,單純獲得數據的Post接口。引起了我對Post,Get接口的思考。
Post,Get接口是咱們最常使用的接口。那麼那些彷佛約定俗成的規則又是怎麼來的呢? 他們究竟哪裏不一樣?
下面讓咱們一探究竟吧。ios

接口簡介

http協議是基於tcp協議的應用層協議,tcp協議做爲可靠的傳輸層協議,所以http協議也是可靠的。平常開發過程當中,最經常使用的是get post put delete,在http協議的規定中,這四個method屬於標準的crud,分別表明了增刪改查,存在着語義上的差異。數據庫

  1. GET請求會向數據庫發索取數據的請求,從而來獲取信息,該請求就像數據庫的select操做同樣,只是用來查詢一下數據,不會修改、增長數據,不會影響資源的內容,即該請求不會產生反作用。不管進行多少次操做,結果都是同樣的。axios

  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表示可能修改變服務器上的資源的請求。markdown

  • 【安全-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使用說明書,敬請期待。