C# 为什么在WebAPI POST方法中使用CreateDataAction返回对象?

C# 为什么在WebAPI POST方法中使用CreateDataAction返回对象?,c#,asp.net-core-webapi,C#,Asp.net Core Webapi,在Asp.NET内核中为API编写POST方法时,可以使用 下面是来自 [HttpPost] [使用(MediaTypeNames.Application.Json)] [产品响应类型(StatusCodes.Status201Created)] [产品响应类型(StatusCodes.Status400BadRequest)] 公共异步任务CreateAsync(产品) { if(product.Description.Contains(“XYZ小部件”)) { 返回请求(); } wait_

在Asp.NET内核中为API编写POST方法时,可以使用

下面是来自

[HttpPost]
[使用(MediaTypeNames.Application.Json)]
[产品响应类型(StatusCodes.Status201Created)]
[产品响应类型(StatusCodes.Status400BadRequest)]
公共异步任务CreateAsync(产品)
{
if(product.Description.Contains(“XYZ小部件”))
{
返回请求();
}
wait_repository.AddProductAsync(产品);
返回CreateDataAction(nameof(GetById),new{id=product.id},product);
}
CreateDataAction操作结果具有以下效果:

  • 响应状态代码为201
  • “Location”响应头将包含在新资源的URI中
  • 创建的对象将在响应体中返回

  • 前两个对我来说似乎是合理的。然而,我想知道为什么需要第三种效果?起初,这似乎是对响应大小的不必要的增加,但我很好奇为什么文档中会出现这种模式,包括创建的对象。返回创建的资源的好处是什么,它是作为请求发送的?或者,将对象包含在响应中的(唯一)原因是包含服务器端生成的值,例如创建日期或主键?

    服务器可以生成客户端不知道的新数据,例如用于创建或修改的ID或时间戳。如果客户机在初始请求后需要此数据,则可以通过将创建的资源包含在响应正文中来节省不必要的往返


    这并不总是最好的选择。您已经权衡了立即访问的好处和带宽使用的增加。在以这种方式返回大量资源之前,需要考虑一些因素。

    这是方便性和灵活性的结合。客户端可能希望验证资源是否按照请求创建,而不遵循位置标头。服务器可能会返回与作为输入的资源不同的资源表示形式,等等。
    [HttpPost]
    [Consumes(MediaTypeNames.Application.Json)]
    [ProducesResponseType(StatusCodes.Status201Created)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    public async Task<IActionResult> CreateAsync(Product product)
    {
        if (product.Description.Contains("XYZ Widget"))
        {
            return BadRequest();
        }
    
        await _repository.AddProductAsync(product);
    
        return CreatedAtAction(nameof(GetById), new { id = product.Id }, product);
    }