REST API 自定义响应查询

REST API Custom Response query

我对 REST 有点陌生 API。我创建了以下控制器来模拟由测试中的客户端代码调用的 API 服务。我需要 return 查询中提到的 JSON 格式的响应,并且需要一些帮助来修复它。

控制器:

    [HttpPost]
    [ApiKeyAuth]
    [ValidateModel]
    [ProducesResponseType(typeof(Item), StatusCodes.Status201Created)]
    public async Task<IActionResult> AddNewItem([FromBody] Item item)
    {

        var itemId = await _repo.AddItemAsync(item);
        return CreatedAtAction(nameof(GetItemById), new { itemId, controller = "Example" },
            itemId);
    }

合同:

public interface IExampleControllerRepository
{
    Task<int> AddItemAsync(Item item);
}

回购:

public class ExampleRepository : IExampleControllerRepository
{
    private readonly ExampleDbContext _context;

    public ExampleRepository(ExampleDbContext context) => _context = context;

    public async Task<int> AddItemAsync(Item item)
    {
        _context.Add(item);
        await _context.SaveChangesAsync();

        return item.ItemId;
    }

}

预期的积极响应模板:

{"response":{"status":0,"data":[{"id":"1234"}]}}
        // Summary:
        //     Creates a Microsoft.AspNetCore.Mvc.CreatedAtActionResult object that produces
        //     a Microsoft.AspNetCore.Http.StatusCodes.Status201Created response.
        //
        // Parameters:
        //   actionName:
        //     The name of the action to use for generating the URL.
        //
        //   routeValues:
        //     The route data to use for generating the URL.
        //
        //   value:
        //     The content value to format in the entity body.
        //
        // Returns:
        //     The created Microsoft.AspNetCore.Mvc.CreatedAtActionResult for the response.
    [NonAction]
    public virtual CreatedAtActionResult CreatedAtAction(string? actionName, object? routeValues, [ActionResultObjectValue] object? value)
    {
         throw null;
    }

响应正文的模板与value的类型有关,所以如果你想得到这样的响应模板:

{"response":{"status":0,"data":[{"id":"1234"}]}}

您需要传递特定类型的 value 而不是 itemId

这是一个简单的演示。

public class Test
    {
        public List<response> responses { get; set; }
    }

public class response
    {
        public int status { get; set; }
        public List<test1> data { get; set; }
    }

public class test1
    {
        public string Id { get; set; }
    }

为了测试方便,我这里硬编码了

        [HttpPost]
        [ApiKeyAuth]
        [ValidateModel]
        [ProducesResponseType(typeof(Item), StatusCodes.Status201Created)]
        public async Task<IActionResult> AddNewItem([FromBody] Item item)
        {
            Test test = new Test()
            {
                responses = new List<response>()
                {
                    new response()
                    {
                        status = 0,
                        data = new List<test1> { 
                              new test1()
                              {
                                  Id = "1234",
                              }
                        }
                    }

                }
            };
            var itemId = await _repo.AddItemAsync(item);
            return CreatedAtAction(nameof(GetItemById), new { Id = item.ItemId }, test);
        }

结果