我正在迁移本地数据存储库层以使用自定义 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,以便客户端可以处理可为空的结果?
执行以下操作将对您有所帮助:
1- 返回 ActionResult 或 IActionResult 以获得更好的结果。因为 api 应该返回状态。
意思是:ActionResult
代码:
[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"
}