在Asp.NET Core中为API编写POST方法时,可以使用CreatedAtAction
中的示例[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操作结果具有以下效果:
前两个对我来说似乎很合理。但是我不知道为什么需要第三种效果?最初,似乎没有必要增加响应大小,但是我很好奇为什么要在文档中按原样显示该模式,包括创建的对象。返回创建的资源的好处是什么?还是将对象包含在响应中的(唯一的)原因是要包含服务器端生成的值,例如创建日期或主键?
答案 0 :(得分:2)
服务器可以生成客户端不知道的新数据,例如用于创建或修改的ID或时间戳。如果客户在初始请求后需要此数据,则可以通过在响应正文中包含创建的资源来节省不必要的往返行程。
它并不总是最佳选择。您权衡了立即访问与带宽使用量增加带来的好处。在以这种方式返回大量资源之前,需要进行一些考虑。