如何处理 requestbody 中布尔值的 0/1 和 false/true 值

问题描述 投票:0回答:2

我目前正在将功能从旧的 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 属性。

有没有一种方法可以处理我的可为空值和整数值,并且仍然有正确的文档?

c# asp.net asp.net-core model-binding api-design
2个回答
0
投票

您所需要做的就是声明

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”

请告诉我们它是否可以帮助您解决问题。


0
投票

另一种可能的解决方案是在同一端点上创建多个 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 值调用此端点;

© www.soinside.com 2019 - 2024. All rights reserved.