🙌
Azure Functionsで入力値の検証を行う
Azure Functionsで入力値の検証を行う
手順は以下の通りです。
- バリデーションチェック用のクラスを作成する
- 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);
}
// 検証に成功した場合の処理
結果
検証に失敗してみます。
以下のデータを送信します。
これは、age
が0
未満のため、検証に失敗します。
{
"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