我目前正在将功能从旧的 HTTP API 迁移到新的 HTTP API。 api 的多个端点期望具有可为 null 布尔值的对象作为请求正文中的 JSON 对象。
型号代码:
public class StatusRequest
{
public bool? Status {get; set;}
}
控制器:
[HttpPost, Route("")]
public async Task<IActionResult> RequestStatus([FromBody] StatusRequest requestData )
{
if(requestData.Status)
{
return Ok();
}
else
{
return BadRequest();
}
}
我现在的问题是,由于我正在从使用 0/1 整数作为布尔值的旧 API 迁移,并且我们希望用户端的必要更改尽可能少,因此 API 应该能够读取 0/ 1 和 false/true 对于请求正文中的属性。
首先,我尝试实现一个实现 IModelBinder 的自定义模型绑定类,它处理 0/1 和可为空值,但由于 [FromBody] 属性,该绑定被忽略。但我无法删除 [FromBody] 属性,因为这样我们的 swagger 文档会将 requestmodel 显示为单独的参数,而不是单个 requestbody。我也无法将 requestbody 示例添加到文档中,因为 OpenApiOperation 类不再具有 RequestBody 属性。
有没有一种方法可以处理我的可为空值和整数值,并且仍然有正确的文档?
您所需要做的就是声明
JsonConverter
。确保您的 API 使用 NewtonsoftJson
来处理 api json 序列化/反序列化。那么您应该创建一个自定义 JsonConverter,它派生自 Newtonsoft.Json.JsonConverter
并处理布尔字段。
然后您需要将您制作的转换器添加到
SerializerSettings
中的 newtonsoftJson Program.cs
中,如下所示:
builder.Services.AddControllers()
.AddNewtonsoftJson(options => {
options.SerializerSettings.Converters.Add(new BoolJsonConverter());
});
如果您想知道如何声明
BoolJsonConverter
,您可以查看 如何让 Newtonsoft 将 bool 序列化为 false,而不是 False 或“false”。
请告诉我们它是否可以帮助您解决问题。
另一种可能的解决方案是在同一端点上创建多个 DTO 作为 [body] 输入,如下所示
public class StatusRequest1
{
public bool Status {get; set;}
}
public class StatusRequest2
{
public int Status {get; set;}
}
你的控制器会是这样的:
[HttpPost, Route("")]
public async Task<IActionResult> RequestStatus([FromBody] StatusRequest1 requestData )
{
...
}
[HttpPost, Route("")]
public async Task<IActionResult> RequestStatus([FromBody] StatusRequest2 requestData )
{
...
}
之后,您可以将
int
值解析回 bool
。 API 客户端可以使用 int 和 bool 值调用此端点;