如何解决为什么我们执行HttpPut请求时发送身份和实体
为什么我们执行HttpPut请求时发送身份和实体。 该ID已在模型上设置。
这是Visual Studio 2019生成的代码
[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();
}
如果我从未看过VS生成的代码,这就是我要编写的代码。
[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质量,无论您是否要在模型中使用它,我都建议将其保留在路由中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。