使用asp.net core 2.1,当发生验证错误时,ApiController将自动响应400 BadRequest。
如何更改/修改发送回客户端的响应(json-body)?有某种中间件吗?
我正在使用FluentValidation验证发送到控制器的参数,但是我对收到的响应不满意。看起来像
{
"Url": [
"'Url' must not be empty.",
"'Url' should not be empty."
]
}
我想更改响应,因为我们有一些附加到响应的默认值。所以我看起来应该像
{
"code": 400,
"request_id": "dfdfddf",
"messages": [
"'Url' must not be empty.",
"'Url' should not be empty."
]
}
答案 0 :(得分:8)
ApiBehaviorOptions
类提供了通过其InvalidModelStateResponseFactory
属性(类型为ModelState
)来定制Func<ActionContext, IActionResult>
响应的能力。
这是一个示例实现:
apiBehaviorOptions.InvalidModelStateResponseFactory = actionContext => {
return new BadRequestObjectResult(new {
Code = 400,
Request_Id = "dfdfddf",
Messages = actionContext.ModelState.Values.SelectMany(x => x.Errors)
.Select(x => x.ErrorMessage)
});
};
传入的ActionContext
实例为活动请求提供ModelState
和HttpContext
属性,其中包含我期望的所有需求。我不确定您的request_id
值来自何处,因此我将其作为静态示例。
要使用此实现,您可以在ApiBehaviorOptions
中配置ConfigureServices
实例,如下所示:
serviceCollection.Configure<ApiBehaviorOptions>(apiBehaviorOptions =>
apiBehaviorOptions.InvalidModelStateResponseFactory = ...
);
答案 1 :(得分:0)
考虑创建自定义action filer,例如:
npm uninstall babel-preset-react-native
npm install babel-preset-react-native@2.1.0
您可以在public class CustomValidationResponseActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
var errors = new List<string>();
foreach (var modelState in context.ModelState.Values)
{
foreach (var error in modelState.Errors)
{
errors.Add(error.ErrorMessage);
}
}
var responseObj = new
{
code = 400,
request_id = "dfdfddf",
messages = errors
};
context.Result = new JsonResult(responseObj)
{
StatusCode = 400
};
}
}
public void OnActionExecuted(ActionExecutedContext context)
{ }
}
中注册它:
ConfigureServices