🙌

Azure Functionsで入力値の検証を行う

2023/03/13に公開

Azure Functionsで入力値の検証を行う

手順は以下の通りです。

  1. バリデーションチェック用のクラスを作成する
  2. Validator クラスによるバリデーションチェックを行う

1. バリデーションチェック用のクラスを作成する

通常のクラスを作成し、検証内容を記述します。

  • [Required]属性を付与することで、必須項目として扱うことが可能。
  • [Range]属性を付与することで、範囲を指定可能。
  • [RegularExpression]属性を付与することで、正規表現での検証が可能。
public class User
{
  [JsonProperty("name")]
  [Required(ErrorMessage = "The name field is required.")]
  public string Name { get; set; }

  [JsonProperty("profession")]
  [Required(ErrorMessage = "The profession field is required.")]
  public string Profession { get; set; }

  [JsonProperty("age")]
  [Required(ErrorMessage = "The age field is required.")]
  [Range(1, int.MaxValue, ErrorMessage = "The age must be a positive integer.")]
  public int Age { get; set; }
}

2. Validatorクラスによるバリデーションチェックを行う

最初にクラスのインスタンスを作成し、Validateメソッドを呼び出します。

// クラスの生成
var user = JsonConvert.DeserializeObject<User>("{...}");

var validationContext = new ValidationContext(user, serviceProvider: null, items: null);
var validationResults = new List<ValidationResult>();
bool isValid = Validator.TryValidateObject(user, validationContext, validationResults, true);
if (isValid == false)
{
  // 検証に失敗した場合の処理
  return new BadRequestObjectResult(validationResults);
}

// 検証に成功した場合の処理

結果

検証に失敗してみます。
以下のデータを送信します。
これは、age0未満のため、検証に失敗します。

{
  "name": "osawa",
  "profession": "engineer",
  "age": -1
}

以下のように、検証結果が返却されます。

[
  {
    "memberNames": [
      "Age"
    ],
    "errorMessage": "The age must be a positive integer."
  }
]

利点

  • バリデーションチェックの記述がシンプルになる
  • バリデーションチェックの記述がクラスに集約される
  • バリデーションチェックの記述が共通化できる
  • バリデーションチェックの記述がテスト可能になる
  • バリデーションチェックの記述が拡張可能になる

注意点

構造体(Struct)は、Validator.TryValidateObjectメソッドで検証できません。
以下のエラーが発生します。

System.Private.CoreLib: Exception while executing function: Insert. System.ComponentModel.Annotations: The instance provided must match the ObjectInstance on the ValidationContext supplied. (Parameter 'instance').

Discussion