1. 程式人生 > 其它 >ASP.NET Core – Web API 冷知識

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 之類的.