使用ASP.NET Core 3.x 構建 RESTful API - 4.3 HTTP 方法的安全性和冪等性


什么樣的HTTP方法是安全的? 

如果一個方法不會改變資源的表述,那么這個方法就被認為是安全的。 

例如 HTTP GET  HTTP HEAD 就被認為是安全的,但需要注意的是,這並不意味着執行GET請求就不會引起其它的資源操作,在表面之下,你的服務層有可能會對其它相關的一些表的數據做出修改,但是本資源的表述不應該被改變。但即使相關的一些數據被修改了,這也不是API消費者所請求的事。 

 

什么樣的HTTP方法是冪等的? 

如果一個方法執行多次和執行一次的結果(帶來的副作用)是一樣的話,那么這個方法就被認為是冪等的。 

 

HTTP方法的安全和冪等表: 

 

 

其中: 

  • GET 是安全的也是冪等的,首先它不會改變資源的表述,而且針對某個資源(的URI)執行一次和執行多次GET的結果是一樣的,這里的結果是指它帶來的副作用,因為GET請求沒有副作用,所以執行一次和執行多次的副作用是一樣的,也就是都沒有副作用。 

  •  OPTIONS  HEAD 的原理和 GET是一樣的。 

  • POST 既不安全也不冪等,首先它會改變資源的表述,因為 POST 會創建資源,而且如果執行多次 POST 的話,多個資源會被創建。 

  • DELETE 也是不安全的,因為它會刪除資源,也就是修改了資源的表述。但是 DELETE 卻是冪等的,因為對某個資源執行一次刪除和執行多次刪除的效果是一樣的。 

  • PUT(整體修改或叫整體替換),它會修改資源所以不是安全的。但是 PUT 卻是冪等的,對某個資源執行多次整體修改(或者叫替換)和執行一次的效果是一樣的(當然請求body里面的參數每次也要一樣)。 

  • PATCH(局部更新)既不是安全的也不是冪等的。它會修改資源表述,所以不是安全的。但是為什么它和 PUT 不一樣,PATCH 不是冪等的呢?因為 PUT 其實是整體替換,替換多次和一次的效果是一樣的,而 PATCH 是針對局部進行修改。比如說公司這個資源有個集合屬性叫做員工,而某個 PATCH 請求會往公司的員工集合里添加一個員工,那么執行一次 PATCH 就會添加一個員工,而執行多次 PATCH 會增加多個員工,通過這個例子可以看出,PATCH(局部更新)不是冪等的。 

 

HTTP 方法的安全性和冪等性是 HTTP標准文檔中的一部分(https://tools.ietf.org/html/rfc7231https://tools.ietf.org/html/rfc5789)。它們不僅僅是純理論,它們應該在不同的業務場景中合理的使用。 

現在我們都應該知道了為什么 GET 請求不應該用來創建或者修改資源了。。。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM