.NET接口JSON字段校验:如何返回具体错误信息?
实现ASP.NET Core接口详细模型验证错误提示
问题背景
你有一个ASP.NET Core的Patch接口,接收UpdateFormRequest模型作为请求体,但当前当输入JSON格式或字段不符合要求时,仅返回模糊的“预期为updateFormRequest”错误,需要返回具体的字段缺失或格式错误提示,且无需手动逐个校验字段。
解决方案
以下两种方式都能自动生成详细的验证错误,无需手动编写字段校验逻辑:
方案1:利用内置模型验证+自定义错误响应
ASP.NET Core自带模型绑定验证机制,只需配置自定义响应格式,即可返回详细错误:
给模型添加数据注解(可选,用于自定义错误提示)
针对UpdateFormRequest的必填字段或格式要求,添加数据注解:using System.ComponentModel.DataAnnotations; public class UpdateFormRequest { [Required(ErrorMessage = "Id字段不能为空")] public Guid Id { get; set; } // 若ArrivalTime是时间格式,可添加格式验证 [RegularExpression(@"^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$", ErrorMessage = "ArrivalTime必须为yyyy-MM-dd HH:mm:ss格式")] public string? ArrivalTime { get; set; } public string? Val1 { get; set; } public string? Val2 { get; set; } }配置全局错误响应格式
在Program.cs中配置ApiBehaviorOptions,将模型验证错误转换为结构化的详细响应:builder.Services.Configure<ApiBehaviorOptions>(options => { options.InvalidModelStateResponseFactory = context => { var detailedErrors = context.ModelState .Where(kv => kv.Value.Errors.Any()) .SelectMany(kv => kv.Value.Errors) .Select(err => err.ErrorMessage) .ToList(); var errorResponse = new { Code = StatusCodes.Status400BadRequest, Message = "请求参数验证失败", DetailedErrors = detailedErrors }; return new BadRequestObjectResult(errorResponse); }; });
方案2:使用FluentValidation实现更灵活的验证
如果需要更复杂的验证规则,FluentValidation是更灵活的选择,同样无需手动校验:
安装依赖包
通过NuGet安装FluentValidation.AspNetCore。创建模型验证器
编写UpdateFormRequest的验证规则:using FluentValidation; public class UpdateFormRequestValidator : AbstractValidator<UpdateFormRequest> { public UpdateFormRequestValidator() { // Id不能为空且必须是有效Guid(非空Guid) RuleFor(req => req.Id) .NotEmpty().WithMessage("Id不能为空") .Must(guid => guid != Guid.Empty).WithMessage("Id必须是有效的Guid值"); // ArrivalTime非空时必须符合指定时间格式 RuleFor(req => req.ArrivalTime) .Matches(@"^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$") .WithMessage("ArrivalTime必须为yyyy-MM-dd HH:mm:ss格式") .When(req => !string.IsNullOrEmpty(req.ArrivalTime)); // 可根据需求添加其他字段的验证规则 } }注册验证服务
在Program.cs中注册FluentValidation服务:builder.Services.AddFluentValidationAutoValidation(); builder.Services.AddFluentValidationClientsideAdapters(); builder.Services.AddScoped<IValidator<UpdateFormRequest>, UpdateFormRequestValidator>();
效果说明
配置完成后,当请求参数不符合要求时,接口会返回包含具体错误信息的响应,例如:
{ "Code": 400, "Message": "请求参数验证失败", "DetailedErrors": [ "Id必须是有效的Guid值", "ArrivalTime必须为yyyy-MM-dd HH:mm:ss格式" ] }
内容的提问来源于stack exchange,提问作者Adrian Gil Moral
相关产品推荐
相关产品推荐

