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

使用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/rfc7231,https://tools.ietf.org/html/rfc5789)。它們不僅僅是純理論,它們應該在不同的業務場景中合理的使用。 

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