[Azure Function][C#]バリデーションをやってみた。

C# C#

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

サンプル

コメント

タイトルとURLをコピーしました