【发布时间】:2021-08-19 15:48:19
【问题描述】:
我有一个带有格式化响应的 API,如下所示:
{
"statusCode": 200,
"totalRecord": 2,
"message": "Succesfully get merchants",
"data": [
{
"id": 1,
"name": "Leo Shop",
"address": "Flower Street 9A",
"isComplete": false,
"createdAt": "2021-05-30T14:16:27.654233",
"updatedAt": "2021-05-30T14:16:28.515476"
},
{
"id": 3,
"name": "Test Shop",
"address": "Playing Street 12A",
"isComplete": false,
"createdAt": "2021-05-30T14:16:27.654233",
"updatedAt": "2021-05-30T14:16:28.515476"
}
]
}
这些响应背后的代码如下所示:
[HttpGet]
public async Task<ActionResult<IEnumerable<Merchant>>> GetMerchants()
{
var data = await _context.Merchants.ToListAsync();
ApiResponse res = new ApiResponse{StatusCode = 200, Message = "Succesfully get merchants", TotalRecord = data.Count, Data = data}; // Focus on this line
return Ok(res);
}
我的问题,如何自动将默认响应转换为 ApiResponse 模型,而无需在每个控制器内的每个操作返回时重复写入 new ApiResponse() 模型?
希望任何人都可以帮助我.. 在此先谢谢大家
【问题讨论】:
-
您的返回值看起来不正确:您没有返回
IEnumerable<Merchant>的列表,您返回的是响应对象的单个实例,不是吗? -
您可以创建中间件来拦截响应并修改响应主体以合并您的 ApiResponse 类。
-
看看 AutoMapper:docs.automapper.org/en/stable/Getting-started.html
-
@PanagiotisKanavos...什么序列化选项将消除在每个端点中新建 ApiResponse 的需要?这个问题似乎更多是关于消除重复代码。也许我误解了它?
-
你真的需要这样的信息吗?当您从 WebAPI 获得成功响应时,它将具有 HTTP 代码 200。在任何情况下,接收到的记录数都是已知的。 “成功获取商家”消息重复了已知信息:“成功” - 代码 200,“获取商家” - 您向其发出请求的 WebAPI 地址。因此,根据 Web API 指南的建议,我将只返回一组数据。
标签: c# asp.net-core entity-framework-core asp.net-core-webapi .net-5