restful風格冪等

2021-08-15 00:12:27 字數 2982 閱讀 2971

理解restful的冪等性,並且設計符合冪等規範的高質量restful api。

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/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方法,用於獲取資源,不管呼叫多少次介面,結果都不會改變,所以是冪等的。

get/tickets       # 獲取ticket列表get/tickets/12

# 檢視某個具體的ticket/tickets # 獲取ticket列表get/tickets/12

# 檢視某個具體的ticket

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

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

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

get/service_time # 獲取伺服器當前時間/service_time # 獲取伺服器當前時間
它本身不會對資源本身產生影響,因此滿足冪等性。

http post方法是乙個非冪等方法,因為呼叫多次,都將產生新的資源。

post/tickets       # 新建乙個ticket/tickets       # 新建乙個ticket
因為它會對資源本身產生影響,每次呼叫都會有新的資源產生,因此不滿足冪等性。

http put方法是不是冪等的呢?我們來看下

put/tickets/12

# 更新ticket 12/tickets/12

# 更新ticket 12

因為它直接把實體部分的資料替換到伺服器的資源,我們多次呼叫它,只會產生一次影響,但是有相同結果的 http 方法,所以滿足冪等性。

http patch方法是非冪等的。http post方法和http put方法可能比較好理解,但是http patch方法只是更新部分資源,怎麼是非冪等的呢?

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

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

patch/tickets/12

# 更新ticket 12/tickets/12

# 更新ticket 12

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

http delete方法用於刪除資源,會將資源刪除。

delete/tickets/12

# 刪除ticekt 12/tickets/12

# 刪除ticekt 12

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

也許,你會想起乙個面試題。http請求的get與post方式有什麼區別?你可能會回答到:get方式通過url提交資料,資料在url中可以看到;post方式,資料放置在html header內提交。但是,我們現在從restful的資源角度來看待問題,http get方法是冪等的,所以它適合作為查詢操作,http post方法是非冪等的,所以用來表示新增操作。

但是,也有例外,我們有的時候可能需要把查詢方法改造成http post方法。比如,超長(1k)的get url使用post方法來替代,因為get受到url長度的限制。雖然,它不符合冪等性,但是它是一種折中的方案。

對於http post方法和ttp put方法,我們一般的理解是post表示建立資源,put表示更新資源。當然,這個是正確的理解。

但是,實際上,兩個方法都用於建立資源,更為本質的差別是在冪等性。http post方法是非冪等,所以用來表示建立資源,http put方法是冪等的,因此表示更新資源更加貼切。

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

如何理解 RESTful 的冪等性

如何設計符合冪等性的高質量restful api 理解restful的冪等性,並且設計符合冪等規範的高質量restful api。http冪等方法,是指無論呼叫多少次都不會有不同結果的 http 方法。不管你呼叫一次,還是呼叫一百次,一千次,結果都是相同的。還是以之前的博文的例子為例。get tic...

設計風格 Restful

rest是設計風格而不是標準,只提供了一組設計原則和約束條件 資源由uri來指定 uri 統一資源識別符號 對資源的包括包括獲取 建立 修改 和刪除資源 這些操作正好對應http協議提供的get post put和delete方法 通過操作資源的表現形式來操作資源 非rest風格url http q...

restful風格概述

利用http協議的四種操作get put delete post實現對伺服器資源的增刪改查 get 用於查詢,post用於新增,put用於修改,delete用於刪除 restful風格程式設計。restful 更強調是資源 webservice,rml等訪問技術更強調過程。restful的重點體現在...