【发布时间】:2019-02-11 15:14:51
【问题描述】:
在 Visual Studio 2017 中,为 .Net Core 2.1 Web API 创建新控制器并使用“使用实体框架添加脚手架 - 带有操作的 API 控制器”向导时,生成的控制器代码为 PUT 操作返回一个 NoContent(),为 POST 操作返回一个 CreatedAtAction()。
// POST: api/Items
[HttpPost]
public async Task<IActionResult> PostItem([FromBody] Item item)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
_context.Item.Add(item);
await _context.SaveChangesAsync();
return CreatedAtAction("GetItem", new { id = item.Id }, item);
}
// PUT: api/Items/5
[HttpPut("{id}")]
public async Task<IActionResult> PutItem([FromRoute] int id, [FromBody] Item item)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
if (id != item.Id)
return BadRequest();
_context.Entry(item).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!ItemExists(id))
return NotFound();
else
throw;
}
return NoContent();
}
我完全同意 POST 操作的返回值。但是关于 PUT 操作返回一个空主体的 NoContent(),这是 RESTful API 的“最佳实践”吗?我的意思是,我知道它返回 NoContent() 状态代码是因为正文为空,但如果它返回 Ok() 表示一切正常,岂不是更有意义?在接收到 NoContent() 状态代码时,操作是否成功似乎有点模棱两可。还是返回 NoContent() 更正确,让消费应用知道它应该忽略正文,并假设因为没有返回错误代码,所以一切正常?
只是想知道 RESTful 最佳实践在这种情况下的规定...
【问题讨论】:
-
没有内容仍然落在 2xx 状态码范围内,这都表明请求处理成功。 restapitutorial.com/httpstatuscodes.html。返回 200 现在只是一个选择问题
-
HTTP 200 表示成功请求。
-
我想问同样的问题,但我的主要问题不是返回
NoContent而不是Ok,而是为什么返回一个空的正文而不是具有更新资源的正文 -
你提到 Veverke 很有趣,我最近只是想知道完全相同的事情。我猜在 PUT 操作中,由于 API 消费者告诉 API 应该更新什么,将这些信息发送回消费者是多余的吗?而使用 POST 操作,将生成一个新的 ID,消费者需要知道它,因此在正文中返回新创建的对象。我实际上目前正在使用一个 API,它在对 PUT 操作的响应主体中返回一个对象。就像 Nkosi 评论的那样,它是可选的 - 如果你愿意,你可以返回对象,但它会消耗更多的带宽。
标签: rest asp.net-core-webapi asp.net-core-2.1