理解http的冪等性

2022-02-06 15:07:42 字數 1662 閱讀 3173

冪等性是什麼?

冪等性——是系統的介面對外一種承諾(而不是實現),承諾只要呼叫介面成功,外部多次呼叫對系統的影響是一致的。

乙個冪等的操作典型如:把編號為5的記錄的a欄位設定為0,這種操作不管執行多少次都是冪等的。

乙個非冪等的操作典型如:把編號為5的記錄的a欄位增加1,這種操作顯然就不是冪等的。

要做到冪等性,從介面設計上來說不設計任何非冪等的操作即可。譬如說需求是:

當使用者點選贊同時,將答案的贊同數量+1。改為:

當使用者點選贊同時,確保答案贊同表中存在一條記錄,使用者、答案。贊同數量由答案贊同表統計出來。

http冪等性是什麼?

http協議本身是一種面向資源的應用層協議,但對http協議的使用實際上存在著兩種不同的方式:一種是restful的,它把http當成應用層協議,比較忠實地遵守了http協議的各種規定;另一種是soa的,它並沒有完全把http當成應用層協議,而是把http協議作為了傳輸層協議,然後在http之上建立了自己的應用層協議。本文所討論的http冪等性主要針對restful風格的,不過正如上一節所看到的那樣,冪等性並不屬於特定的協議,它是分布式系統的一種特性;所以,不論是soa還是restful的web api設計都應該考慮冪等性。下面將介紹http get、delete、put、post四種主要方法的語義和冪等性。

1)get

httpget方法用於獲取資源,不應有***,所以是冪等的。比如:get 不會改變資源的狀態,不論呼叫一次還是n次都沒有***。請注意,這裡強調的是一次和n次具有相同的***,而不是每次get的結果相同。get 這個http請求可能會每次得到不同的結果,但它本身並沒有產生任何***,因而是滿足冪等性的。

2)delete

httpdelete方法用於刪除資源,有***,但它應該滿足冪等性。比如:delete 呼叫一次和n次對系統產生的***是相同的,即刪掉id為4231的帖子;因此,呼叫者可以多次呼叫或重新整理頁面而不必擔心引起錯誤。

3)post

比較容易混淆的是http post和put。post和put的區別容易被簡單地誤認為「post表示建立資源,put表示更新資源」;而實際上,二者均可用於建立資源,更為本質的差別是在冪等性方面。post所對應的uri並非建立的資源本身,而是資源的接收者。比如:post 的語義是在下建立一篇帖子,http響應中應包含帖子的建立狀態以及帖子的uri。兩次相同的post請求會在伺服器端建立兩份資源,它們具有不同的uri;所以,post方法不具備冪等性。

4)put

而put所對應的uri是要建立或更新的資源本身。比如:put 的語義是建立或更新id為4231的帖子。第一次put方法執行之後,其在伺服器上生成的資源,不能被後續的put方法更改,所以對同一uri進行多次put的***和一次put是相同的;因此,put方法具有冪等性。

電商應用中如何防範 post 重複提交?

http post 操作既不是安全的,也不是冪等的(至少在http規範裡沒***)。當我們因為反覆重新整理瀏覽器導致多次提交表單,多次發出同樣的post請求,導致遠端伺服器重複建立出了資源。

所以,對於電商應用來說,第一對應的後端 webservice 一定要做到冪等性,第二伺服器端收到 post 請求,在操作成功後必須302跳轉到另外乙個頁面,這樣即使使用者重新整理頁面,也不會重複提交表單。

具備「冪等性」的方法是安全的,因此在程式中冪等性也是應該追求的一項性質,很多時候程式不應該假定使用者的行為,不能因為使用者的重複操作而導致資料出現問題。

Http中的冪等性

理解restful的冪等性,並且設計符合冪等規範的高質量restful api。http冪等方法,是指無論呼叫多少次都不會有不同結果的 http 方法。不管你呼叫一次,還是呼叫一百次,一千次,結果都是相同的。例如 get tickets 獲取ticket列表 get tickets 12 檢視某個具...

如何理解 RESTful 的冪等性

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

如何理解RESTfull的冪等性

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