为什么我们执行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质量,无论您是否要在模型中使用它,我都建议将其保留在路由中。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...