为什么我们在发出 HttpPut 请求时发送身份和实体

Why do we send the identity and the entity when we do a HttpPut request

为什么我们在发出 HttpPut 请求时要发送身份和实体。 Id 已在模型上设置。

这是Visual Studio2019

生成的代码
  [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给table带来了什么??

这与惯例有关,而不是严格要求 ID 出现在路由中。 Visual Studio 的模板遵循创建 API 的 RESTful 风格,并且 style/convention 指出 PUT 端点应该代表正在更新的实体。没有 ID 的 route/URL(例如“/report”)不代表正在更新的特定报告(即使 ID 在有效负载中),而有 ID 的则代表(例如“/report/12345").

如果这是面向 API 的 public,那么我强烈建议您遵循一般的 REST 约定并在路由中包含 ID。如果没有,那么你可以随心所欲地灵活,但代价是不遵循大多数 REST API 遵循的一般约定(这可能会使阅读你的代码的其他人感到困惑)。

有些人在路线和模型中都包含 ID,有些人只在路线中走,完全有可能也只在模型中走。但是如果你想保持一般的 RESTful 质量,我建议无论你是否想要它在模型中都将它保留在路线中。