问题描述
为什么我们执行HttpPut请求时发送身份和实体。 该ID已在模型上设置。
[HttpPut("{id}")]
public async Task<IActionResult> PutReport(int id,Report report)
{
if (id != report.Id)
{
return BadRequest();
}
_context.Entry(report).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (dbupdateConcurrencyException)
{
if (!ReportExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
[HttpPut]
public async Task<IActionResult> PutReport(Report report)
{
if (report.Id == 0)
{
return BadRequest();
}
_context.Entry(report).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (dbupdateConcurrencyException)
{
if (!ReportExists(report.Id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
那么ID会带来什么?
解决方法
这与约定有关,而不是严格要求将ID包含在路由中。 Visual Studio的模板遵循RESTful创建API的样式,并且该样式/约定指出PUT端点应代表要更新的实体。没有ID(例如“ / report”)的路由/ URL并不表示要更新的特定报告(即使ID在有效负载中),而具有ID的路由/ URL(例如“ / report / 12345”)也可以
如果这是一个面向公众的API,那么我强烈建议您遵循常规REST约定并将ID包含在路由中。如果没有,那么您将拥有所需的灵活性,但是要以不遵循大多数REST API遵循的通用约定为代价(这可能会使其他阅读您的代码的人感到困惑)。
有些人在路线和模型中都包含ID,有些人只在路线中走,而且完全可能也只在模型中走。但是,如果您想保持一般的RESTful质量,无论您是否要在模型中使用它,我都建议将其保留在路由中。