什麼是冪等性

HTTP 冪等方法,是指無論調用多少次都不會有不同結果的 HTTP 方法。不管你調用一次,還是調用一百次,一千次,結果都是相同的。

GET     /tickets       # 獲取ticket列表
GET     /tickets/12    # 查看某個具體的ticket
POST    /tickets       # 新建一個ticket
PUT     /tickets/12    # 更新ticket 12
PATCH   /tickets/12    # 更新ticket 12
DELETE  /tickets/12    # 刪除ticekt 12

HTTP GET 方法


HTTP GET 方法,用於獲取資源,不管調用多少次接口,結果都不會改變,所以是冪等的。

GET     /tickets       # 獲取ticket列表
GET     /tickets/12    # 查看某個具體的ticket

只是查詢數據,不會影響到資源的變化,因此我們認爲它冪等。

值得注意,冪等性指的是作用於結果而非資源本身。怎麼理解呢?例如,這個 HTTP GET 方法可能會每次得到不同的返回內容,但並不影響資源。

可能你會問有這種情況麼?當然有咯。例如,我們有一個接口獲取當前時間,我們就應該設計成

GET     /service_time # 獲取服務器當前時間

它本身不會對資源本身產生影響,因此滿足冪等性。

HTTP POST 方法


HTTP POST 方法是一個非冪等方法,因爲調用多次,都將產生新的資源。

POST    /tickets       # 新建一個ticket

因爲它會對資源本身產生影響,每次調用都會有新的資源產生,因此不滿足冪等性。

HTTP PUT 方法


HTTP PUT 方法是不是冪等的呢?我們來看下

PUT     /tickets/12    # 更新ticket 12

因爲它直接把實體部分的數據替換到服務器的資源,我們多次調用它,只會產生一次影響,但是有相同結果的 HTTP 方法,所以滿足冪等性。

HTTP PATCH 方法


HTTP PATCH 方法是非冪等的。HTTP POST 方法和 HTTP PUT 方法可能比較好理解,但是 HTTP PATCH 方法只是更新部分資源,怎麼是非冪等的呢?

因爲,PATCH 提供的實體則需要根據程序或其它協議的定義,解析後在服務器上執行,以此來修改服務器上的資源。換句話說,PATCH 請求是會執行某個程序的,如果重複提交,程序可能執行多次,對服務器上的資源就可能造成額外的影響,這就可以解釋它爲什麼是非冪等的了。

可能你還不能理解這點。我們舉個例子

PATCH   /tickets/12    # 更新ticket 12

此時,我們服務端對方法的處理是,當調用一次方法,更新部分字段,將這條 ticket 記錄的操作記錄加一,這次,每次調用的資源是不是變了呢,所以它是有可能是非冪等的操作。

HTTP DELETE 方法


HTTP DELETE 方法用於刪除資源,會將資源刪除。

DELETE  /tickets/12    # 刪除ticekt 12

調用一次和多次對資源產生影響是相同的,所以也滿足冪等性。

如何設計符合冪等性的高質量 RESTful API


也許,你會想起一個面試題。HTTP 請求的 GET 與 POST 方式有什麼區別? 你可能會回答到:GET 方式通過 URL 提交數據,數據在 URL 中可以看到;POST 方式,數據放置在 HTML HEADER 內提交。但是,我們現在從 RESTful 的資源角度來看待問題,HTTP GET 方法是冪等的,所以它適合作爲查詢操作,HTTP POST 方法是非冪等的,所以用來表示新增操作。
但是,也有例外,我們有的時候可能需要把查詢方法改造成 HTTP POST 方法。比如,超長(1k)的 GET URL 使用 POST 方法來替代,因爲 GET 受到 URL 長度的限制。雖然,它不符合冪等性,但是它是一種折中的方案。

HTTP POST vs HTTP PUT


對於 HTTP POST 方法和 HTTP PUT 方法,我們一般的理解是 POST 表示創建資源,PUT 表示更新資源。當然,這個是正確的理解。

但是,實際上,兩個方法都用於創建資源,更爲本質的差別是在冪等性。HTTP POST 方法是非冪等,所以用來表示創建資源,HTTP PUT 方法是冪等的,因此表示更新資源更加貼切。

HTTP PUT vs HTTP PATCH


此時,你看會有另外一個問題。HTTP PUT 方法和 HTTP PATCH 方法,都是用來表述更新資源,它們之間有什麼區別呢?我們一般的理解是 PUT 表示更新全部資源,PATCH 表示更新部分資源。首先,這個是我們遵守的第一準則。根據上面的描述,PATCH 方法是非冪等的,因此我們在設計我們服務端的 RESTful API 的時候,也需要考慮。如果,我們想要明確的告訴調用者我們的資源是冪等的,我的設計更傾向於使用 HTTP PUT 方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章