【问题标题】:Is there any need for the int id in the PUT method code below?下面的PUT方法代码中是否需要int id?
【发布时间】:2019-08-14 11:36:03
【问题描述】:

我是 asp.net core 和 c# 的新手,但我不明白为什么我的 PUT 方法声明一个 id 属性并尝试将它与我的模型类中的 ID 属性绑定。为什么action不能直接调用ID属性?

    [HttpPut("{id}")]

    public async Task<IActionResult> PutPatient(int id, Patient patient)

    {
        if (id != patient.PatientId)

        {

            return BadRequest();

        }

【问题讨论】:

  • 你当然可以,但是,嘿,REST。
  • 你能发布你的替代方案吗?
  • 在 URL 和正文中指定 id 似乎有点多余。这个想法可能是对请求和响应使用相同的模型。
  • @juunas 我猜是这样。但是有没有可能的方法来做到这一点而没有冗余

标签: c# asp.net-core model-view-controller


【解决方案1】:

我认为这可能与防止创建重复记录有关。根据Microsoft REST API Guidelines(强调是我的):

POST 请求不是幂等的。这意味着发送到具有完全相同有效负载的集合资源的两个 POST 请求可能会导致在该集合中创建多个项目。对具有服务器端生成的 id 的项目执行插入操作通常就是这种情况。

例如下面的请求:

POST https://api.contoso.com/v1.0/people

将导致响应指示新集合项的位置:

201 Created Location: https://api.contoso.com/v1.0/people/123

再次执行,可能会导致另一个资源:

201 Created Location: https://api.contoso.com/v1.0/people/124

虽然 PUT 请求需要使用相应的键来指示集合项

PUT https://api.contoso.com/v1.0/people/123

【讨论】:

    【解决方案2】:

    下面的链接包含对我的问题最有用的答案。说明我正在更新患者,说 id=4 并使用 URL 发送 id 值,但我正在更新的数据在请求正文中。所以我需要将 PUT 方法中的 id 绑定到模型主体中的 Id 参数。希望这是有道理的。谢谢大家

    https://www.dotnettricks.com/learn/webapi/model-binding-model-binder-example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 2023-02-08
      • 1970-01-01
      • 2021-02-07
      • 2012-07-06
      • 2013-09-15
      • 1970-01-01
      相关资源
      最近更新 更多