ApiController 中的可为空响应

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

我正在迁移本地数据存储库层以使用自定义 API 后端(之前我使用的是 SQLite,现在我将拥有一个基于

AspNetCore
的 API 和常规 SQL。

我的问题是......我真的不知道如何使用可以返回

null
的方法创建控制器。

示例:

[ApiController]
public class DataController : ControllerBase
{
  public DateTime? GetSomeDateValue(string key)
  {
     DateTime? result = GrabTheResultFromTheDatabase(key); //<- if the key doesn't exist, this can be null and this is expected
     return result;
  }
}

问题是生成的模式似乎没有反映结果的这种“可空性”,并且生成的客户端明确需要一个 DateTime 值,如果该值实际上不存在,则会抛出异常。

作为参考,我正在使用以下 CSPROJ 定义构建客户端:

<OpenApiReference Include="..\Backend\BackendService.json" CodeGenerator="NSwagCSharp" Link="OpenAPIs\BackendService.json">
   <Options>/GenerateClientInterfaces:true /AdditionalNamespaceUsages:Base.Entities /GenerateDtoTypes:false</Options>
</OpenApiReference>

我应该如何设置控制器/NSwagCSharp,以便客户端可以处理可为空的结果?

c# asp.net .net-core openapi asp.net-apicontroller
1个回答
0
投票

执行以下操作将对您有所帮助:

1- 返回 ActionResult 或 IActionResult 以获得更好的结果。因为 api 应该返回状态。 意思是:ActionResult 而不仅仅是 DateTime? 这为处理不同的响应场景提供了更大的灵活性,例如如果密钥不存在则返回 404 Not Found。

代码:

[HttpGet("GetSomeDateValue")]
public ActionResult<DateTime?> GetSomeDateValue(string key)
{
    DateTime? result = GrabTheResultFromTheDatabase(key);
    if (result == null)
    {
        return NotFound(); // Return a 404 Not Found if the key doesn't exist
    }
    return Ok(result);
}

2-还要检查 NSwag 配置中的可空类型。它应该反映响应的可为空性质。

GenerateNullableReferenceTypes 应该为 true。

<OpenApiReference Include="..\Backend\BackendService.json" CodeGenerator="NSwagCSharp" Link="OpenAPIs\BackendService.json">
   <Options>/GenerateClientInterfaces:true /AdditionalNamespaceUsages:Base.Entities /GenerateDtoTypes:false /GenerateNullableReferenceTypes:true</Options>
</OpenApiReference>

还要检查 json 配置。应该是这样的。

 "responses": {
        "200": {
          "description": "Success",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "result": {
                    "type": "string",
                    "format": "date-time",
                    "nullable": true
                  }
                }
              }
            }
          }
        },
        "404": {
          "description": "Not Found"
        }
© www.soinside.com 2019 - 2024. All rights reserved.