在 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 操作结果具有以下效果:
- 响应状态代码将为 201
- “位置”响应 header 将包含在新资源的 URI 中
- 创建的对象将在响应正文中返回
前两个对我来说似乎很合理。但我想知道为什么需要第三种效果?起初,这似乎是响应大小的不必要的增加,但我很好奇为什么该模式按原样显示在文档中,包括创建的对象。返回创建的资源(无论如何都是作为请求发送的)有什么好处?或者在响应中包含对象的(唯一)原因可能是包含服务器端生成的值,例如创建日期或主键?
最佳答案
服务器可以生成客户端不知道的新数据,例如创建或修改的 ID 或时间戳。如果客户端在初始请求后需要此数据,则可以通过在响应正文中包含创建的资源来节省不必要的往返。
这并不总是最好的选择。您已经权衡了立即访问和增加带宽使用的好处。在以这种方式返回大量资源之前,需要进行一些考虑。
关于c# - 为什么在 WebAPI POST 方法中使用 CreatedAtAction 返回对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61813704/