c# - 为什么在 WebAPI POST 方法中使用 CreatedAtAction 返回对象?

标签 c# asp.net-core-webapi

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

以下示例来自 documentation

[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);
}

CreatedAtAction 操作结果具有以下效果:

  1. 响应状态代码将为 201
  2. “位置”响应 header 将包含在新资源的 URI 中
  3. 创建的对象将在响应正文中返回

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

最佳答案

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

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

关于c# - 为什么在 WebAPI POST 方法中使用 CreatedAtAction 返回对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61813704/

相关文章:

c# - 将扩展方法与单声道一起使用

c# - 带有 OAuth2 的 Youtube API v3 返回 "Received verification code. Closing..."

error-handling - 在错误处理操作中如何确定我应该返回 web View 还是 api 响应

c# - bool类型返回规则

c# - C# 和 .NET 版本是否相互依赖?

linux - 无法确定 Docker 中重定向的 https 端口

asp.net-core - 在反向代理后面运行时,使用端口 80 进行 https 的 Swashbuckle

c# - 从 ASP.NET 到 .NET Core 的 DelegateHandler

c# - Random.Next() 总是返回 0

c# - 使 .NET Core Web 应用程序可以通过接口(interface)而不是直接引用 EF DbContext