当我们发出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给我们带来了什么呢?
发布于 2020-10-02 01:37:32
这更多地与约定有关,而不是与路由中对ID的严格要求有关。Visual Studio的模板遵循创建API的RESTful样式,该样式/约定声明PUT端点应该表示正在更新的实体。没有ID的路由/网址(例如,"/report")并不代表正在更新的特定报告(即使ID在有效负载中),而具有ID的路由/网址(例如,"/ report /12345")。
如果这是一个面向公众的API,那么我强烈建议您遵循一般的REST约定,并在路由中包含ID。如果不是,那么您可以想要多少灵活性就有多大的灵活性,但代价是不遵循大多数REST遵循的通用约定(这可能会让其他人在阅读您的代码时感到困惑)。
有些人在路线和模型中都包含ID,有些人只在路线中走,也完全可能只在模型中走。但是,如果你想保持一般的RESTful质量,我建议无论你是否想要它在模型中,都要将它保留在路径中。
https://stackoverflow.com/questions/64160414
复制相似问题