.net core 3.x webapiの入力検証とカスタムエラー
自分がいることを記録してください.Netcore 3.0でwebapiを使用するいくつかの入力検証
入力検証 1.1 Data Annotations
post/put/patchなどのリクエストを使用すると、apiは通常modelタイプのパラメータを受信し、DataAnnotationsプロパティを使用して一般的なパラメータを制約し、検証が必要なパラメータに直接注釈を付けることができます.以下のようにします.
1.2 IValidatableObject
api受信パラメータタイプとして扱われるモデルは、IValidatableObjectインタフェースを実装するValidateメソッドを必要とし、以下のようにする.
1.3カスタムプロパティー
自分で新しいクラスを作成し、クラスValidationAttributeを続行し、クラス内のIsValidメソッドを次のように書き換えます.
カスタムエラー カスタムエラーメッセージはStartup.csクラスに依存注入を行いservices.AddControllersなどの後には、次のようになります.
post/put/patchなどのリクエストを使用すると、apiは通常modelタイプのパラメータを受信し、DataAnnotationsプロパティを使用して一般的なパラメータを制約し、検証が必要なパラメータに直接注釈を付けることができます.以下のようにします.
[Display(Name = " ")]
[Required(ErrorMessage = "{0} ")]
public string Name { get; set; }
1.2 IValidatableObject
api受信パラメータタイプとして扱われるモデルは、IValidatableObjectインタフェースを実装するValidateメソッドを必要とし、以下のようにする.
public IEnumerable Validate(ValidationContext validationContext)
{
if (Name == Add)
{
yield return new ValidationResult(" ", new[] { nameof(DemoDto) });
}
}
1.3カスタムプロパティー
自分で新しいクラスを作成し、クラスValidationAttributeを続行し、クラス内のIsValidメソッドを次のように書き換えます.
public class DemoDifferenceAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var demodto = (DemoDto)validationContext.ObjectInstance;
if (demodto.Name == demodto.Add)
{
return new ValidationResult(ErrorMessage, new[] { nameof(DemoDto) });
}
return ValidationResult.Success;
}
}
services.AddControllers(setup=> {
setup.ReturnHttpNotAcceptable = true;
setup.CacheProfiles.Add("120CacheProfile", new CacheProfile()
{
Duration = 120
});
}).AddXmlDataContractSerializerFormatters()
.ConfigureApiBehaviorOptions(setup=>
{
setup.InvalidModelStateResponseFactory = context => {
var problemdetails = new ValidationProblemDetails(context.ModelState)
{
Type = "http://localhost:8082", //
Title = " ",
Status = StatusCodes.Status422UnprocessableEntity,
Detail = " ", //
Instance = context.HttpContext.Request.Path
};
problemdetails.Extensions.Add("traceId", context.HttpContext.TraceIdentifier);
return new UnprocessableEntityObjectResult(problemdetails)
{
ContentTypes = { "application/problem+json" }
};
};
});