ASP.NET Core – Web API 冷知識
Under/Over Posting
參考:
.NET Core WebApi Action is executed even with missing properties in the request body
Model Validation in ASP.NET Web API(找 under-posting)
Model validation in ASP.NET Core MVC and Razor Pages
Input Validation vs. Model Validation in ASP.NET MVC
什麼是 under/over-posting?
假設一個 Post 請求需要一個 ProductDTO, 裡面有 Name, Price 2 個屬性
public class ProductDTO { public string Name { get; set; } = ""; public decimal Price { get; set; } }
Client 在發請求時, 給了一個空物件. 這種情況就叫 under-posting (給的 property 不夠), 如果給了一些額外的 property 那就叫 over-posting (給多了)
預設情況下, ASP.NET Core 遇到 under-posting, 它會給 default value. 跟 new Class() 一樣.
當遇到 over-posting 的時候, 多的 property 會被 ignore, 最後的 instance 自然不會有多餘的 property.
Ignore over-posting 通常是 ok 的, 但是 default value for under-posting 有時候會反直覺.
比如有一個必填的 enum, 我們會想加一個 [Required] or NotEmpty(), 但是由於有 default value 機制. 它會自動填入 enum first value.
以至於, [Required] 肯定通過, 而 NotEmpty() 則不允許是 default value (意味著使用者即便真的想選 enum first value 也會被誤以為是 default value)
所以最終就是根本不需要寫 required validation 就對了.int = 0, bool = false 也是同樣的情況.
如果不希望這種情況誕生, ASP.NET Core 給出的 idea 是 set the property to nullable, 這樣就不會有 default value 了.
當然 nullable 對後續的呼叫是否友好是另一個問題. 我個人比較喜歡 default value + 不寫 required validation 機制的.
因為 under-posting 本來就是 front-end mistake 引發的問題 (沒有讀 API 文件嗎? 那還要我寫?). under-posting 並不會導致 hacking 問題. 因為 default value 是否可以過 (比如 int = 0)
會有其它的 validation 去驗證, 比如 int value > 0 之類的.