首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我们在发送HttpPut请求时要发送标识和实体

为什么我们在发送HttpPut请求时要发送标识和实体
EN

Stack Overflow用户
提问于 2020-10-02 01:27:21
回答 1查看 14关注 0票数 0

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

这是Visual Studio 2019生成的代码

代码语言:javascript
复制
  [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生成的代码,我会编写的代码。

代码语言:javascript
复制
[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给我们带来了什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-02 01:37:32

这更多地与约定有关,而不是与路由中对ID的严格要求有关。Visual Studio的模板遵循创建API的RESTful样式,该样式/约定声明PUT端点应该表示正在更新的实体。没有ID的路由/网址(例如,"/report")并不代表正在更新的特定报告(即使ID在有效负载中),而具有ID的路由/网址(例如,"/ report /12345")。

如果这是一个面向公众的API,那么我强烈建议您遵循一般的REST约定,并在路由中包含ID。如果不是,那么您可以想要多少灵活性就有多大的灵活性,但代价是不遵循大多数REST遵循的通用约定(这可能会让其他人在阅读您的代码时感到困惑)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64160414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档