Azure FunctionのC#でバリデーションを試してみました!
クラスに属性でバリデーションを書いて、Validator.TryValidateObjectを使うとバリデーションできました。
結果はList<ValidationResult>の形式で返ってきます。
サンプルコード
Function本体
[FunctionName("CSharpValidationTest")]
public static IActionResult CSharpValidationTest(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "csharp_test_validation")] HttpRequest req,
ILogger log
)
{
TestRequest request = new TestRequest();
request.Name = req.Query["name"];
request.Age = req.Query["age"];
request.ZipCode = req.Query["zip_code"];
request.BirthDay = DateTime.Parse(req.Query["birth"]);
List<ValidationResult> results = new List<ValidationResult>();
Validator.TryValidateObject(request, new ValidationContext(request, null, null), results, true);
if (results.Count != 0)
{
foreach (ValidationResult result in results) {
Console.WriteLine(result.ErrorMessage);
}
return new BadRequestResult();
}
return new CreatedResult("", request);
}
リクエストクラス
public class TestRequest
{
[Required]
[MaxLength(10)]
[MinLength(3)]
[JsonProperty(PropertyName = "name")]
public string Name { get; set; }
[Required]
[Range(20,30)]
[JsonProperty(PropertyName = "age")]
public string Age { get; set; }
[Required]
[RegularExpression(@"^[0-9]{3}-[0-9]{4}$")]
[JsonProperty(PropertyName = "zip_code")]
public string ZipCode{ get; set; }
[Required]
[JsonProperty(PropertyName = "birth")]
public DateTime BirthDay { get; set; }
}
説明
TestRequestクラスのインスタンスを用意して、リクエスト結果を入れてます。
失敗した場合の結果を受け取るList<ValidationResult>をresultという名前で定義して、それぞれValidator.TryValidateObjectに渡しています。
Validator.TryValidateObjectに渡す引数は公式を確認すると下記のようになっています。
引数1:検証対象のオブジェクト。
引数2:検証対象のオブジェクトを説明するコンテキスト。
引数3:失敗した各検証を保持するコレクション。
引数4つ目はすべて検証する場合はtrueらしいです。
んー引数2つ目がよくわからん。。。エラーメッセージも日本語とかでここに渡すと良さそう?
あとは、失敗すると結果がリストで返ってくるので、Countを確認して要素があったら
foreachでつらつら回して、ErrorMessageを出しています。
動作確認
実行後、URLにパラメータを渡して確認します。
必須がない場合
http://localhost:7071/api/csharp_test_validation?birth=2019-1-1
--- 結果 ---
The Name field is required.
The Age field is required.
The ZipCode field is required.
文字数制限、文字の範囲制限、正規表現に一致しない場合
http://localhost:7071/api/csharp_test_validation?birth=2019-1-1&name=a&age=10&zip_code=1112222
--- 結果 ---
The field Name must be a string or array type with a minimum length of '3'.
The field Age must be between 20 and 30.
The field ZipCode must match the regular expression '^[0-9]{3}-[0-9]{4}$'.
ちゃんと動いてそうです!
参考
公式:Validator.TryValidateObjectページ
https://docs.microsoft.com/ja-jp/dotnet/api/system.componentmodel.dataannotations.validator.tryvalidateobject?view=netframework-4.8
公式:System.ComponentModel.DataAnnotations (バリデーションで使える属性の一覧)
https://docs.microsoft.com/ja-jp/dotnet/api/system.componentmodel.dataannotations?view=netframework-4.8
コメント