.net core 3.x webapiの入力検証とカスタムエラー

2755 ワード

自分がいることを記録してください.Netcore 3.0でwebapiを使用するいくつかの入力検証
 
  • 入力検証
  • 1.1  Data Annotations
    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;
            }
        }

     
  • カスタムエラー
  • カスタムエラーメッセージはStartup.csクラスに依存注入を行いservices.AddControllersなどの後には、次のようになります.
     
     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" }
                        };
                    };
                });