格式化 webapi 响应 .net 核心

Posted

技术标签:

【中文标题】格式化 webapi 响应 .net 核心【英文标题】:format webapi response .net core 【发布时间】:2018-02-26 14:27:39 【问题描述】:

我正在创建一个 .net 核心 API。目前它运作良好,但我想在答案中提供更多有用的信息,以便客户可以直接消费所述信息而找不到正确的方法。

我有一个通用驱动程序,它现在返回一个包含三个对象的向量,其中包含数据库中的流派信息:

[HttpGet]
        public IEnumerable<Gender> GetAll()
        
            List<Gender> GenderModel = new List<Gender>();
            genderService.GetGender().ToList().ForEach(u => 
                Gender genero = new Gender
                (
                 u.Id,
                 u.Name
                );
                GenderModel.Add(gender);
            );

            return GenderModel.ToList();
        

答案如下:

[
  
    "id": 1,
    "value": "Masculino"
  ,
  
    "id": 2,
    "value": "Femenino"
  ,
  
    "id": 3,
    "value": "Otros"
  
]

但是,我希望答案是这样的:


    "results": [
        
            "id": 0,
            "value: "Otro"
        ,
        
            "id": 1,
            "value": "Masculino"
        ,
        
            "id": 2,
            "value": "Femenino"
        
    ],
    "info": 
        "results": 3,
        "version": "1.0"
    

显然,您想要作为另一个 JSON 对象或在 info 对象中添加的任何其他信息也必须发送。我的问题是如何撰写该答案。 另一件不太清楚的事情是,来自 .net 核心 webapi 的响应是矢量格式,里面有对象,通常我使用的所有 api 都是 JSON 中的响应,里面有其他 JSON 对象,我使用没有问题这种格式在前端,但我开始怀疑。

【问题讨论】:

【参考方案1】:

您应该更改返回对象。 ActionResult 包装你的回应 ASP.net core return Json with status code

[HttpPost]        
    public new async Task<IActionResult> Get([FromBody] QueryParams parameters)
    
            List<Gender> GenderModel = new List<Gender>();
            genderService.GetGender().ToList().ForEach(u => 
                Gender genero = new Gender
                (
                 u.Id,
                 u.Name
                );
                GenderModel.Add(gender);
            );

            return Ok(GenderModel.ToList();
    

接下来,如果您想在响应中提供更多详细信息,请使用 ActionFilter in

    public void OnActionExecuted(ActionExecutedContext context)
    
        // do something after the action executes
        // your reponse is in context.response.content 
    

【讨论】:

谢谢,这与 Yared 的回答相结合就是解决方案!【参考方案2】:

创建 POCO 类来建模 api 响应:

        public class ApiResponse
            public object Results  get; set; 
            public object Info  get; set; 
        


        //Implementation of ApiResponse
        [HttpGet]
        public ApiResponse GetAll()
        
                var data = genderService.GetGender().Select(g => 
                 new Gender()
                   Id = g.Id,
                   Name = g.Name
                 ).ToList();

                var apiResponse = new ApiResponse();
                apiResponse.Results = data;
                apiResponse.Info = new Results = data.Length, Version = "1.0";

                return apiResponse;
        

【讨论】:

以上是关于格式化 webapi 响应 .net 核心的主要内容,如果未能解决你的问题,请参考以下文章

.net core 杂记:WebAPI的XML请求和响应

Asp.Net WebAPI配置接口返回数据类型为Json格式

Asp.Net WebAPI配置接口返回数据类型为Json格式

WebApi接口 - 响应输出xml和json

WebApi接口 - 响应输出xml和json

模型绑定不适用于 asp.net 核心 Web api 控制器操作方法中的 Stream 类型参数。(即使使用自定义流输入格式化程序)