【问题标题】:format webapi response .net core格式化 webapi 响应 .net 核心
【发布时间】: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 对象,我使用没有问题这种格式在前端,但我开始怀疑。

【问题讨论】:

    标签: rest api .net-core


    【解决方案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;
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 2018-06-30
      相关资源
      最近更新 更多