【问题标题】:mix POST and PUT for updates in rest service混合 POST 和 PUT 以在休息服务中进行更新
【发布时间】:2017-10-16 23:59:09
【问题描述】:

我知道这可能是关于这个问题的第 1 次讨论,但我找不到具体问题的答案。

我们有一个内部讨论是否使用 PUT 来更新我们的 rest 服务。我们已经同意优先使用 PUT。但是,PUT 需要是幂等的。这是否意味着我们应该根据幂等性为不同的更新路由混合 POST 和 PUT 动词?

作为一个具体的例子。我们有一个更新路线,更新,比方说“汽车”。对于此更新路线,您可以(除其他外)传递超链接。此超链接在保存时将获得一个 id,并将链接到更新的汽车。但是每次在车上更新,生成的超链接的id都会不一样。这是否意味着更新不再是幂等的?即使超链接的实际目标是相同的?

如果是这样,我们应该在此更新中使用 POST 动词,而不是 PUT 动词。但是,我们还有许多其他更新路由是幂等的。他们应该保持 PUT 吗?我相信这对于服务的消费者来说可能会变得非常混乱。

简而言之:

  • 根据是否具有幂等性,混合 PUT 和 POST 来更新路由是否是个好主意?
  • 还是说动词的一致性胜过幂等规则,我们是否应该简单地将 PUT 用于所有更新路由?
  • 还是应该放弃使用 PUT 并在任何地方使用 POST 来完全避免混淆的想法?

【问题讨论】:

    标签: rest post asp.net-web-api put


    【解决方案1】:

    我与 stackoverflow 之外的人进行了一些讨论。我们得出以下结论:

    • 混合使用 POST 和 PUT 进行更新不是一个好主意,这会让消费者感到困惑
    • 一致性胜过 PUT 的幂等规则
    • 到处使用 post 并不是一个好主意,因为人们习惯于使用 PUT 进行更新

    理想情况下,我们会更改我们的代码(来自最初问题中的示例)以确保超链接的 id 不会改变。在这种情况下,不会讨论使用 PUT 或 POST。如果我们不能做到这一点,我们将在 API 自述文件中写一个“免责声明”,以确保让人们知道某些 PUT 路由并不是真正的幂等

    【讨论】:

      【解决方案2】:

      通常规则是,如果客户端知道它正在创建的资源的目标 URI,则始终首选 PUTPOST 在创建新资源方面很受欢迎,但这主要是因为许多 API 想要确定目标 URI(例如,如果您的数据库使用自动递增的 id)。

      【讨论】:

      • 问题是,我不是在创建资源,而是在更新它们。每个人都在谈论创造资源,这就是我创造这个问题的原因。你能试着从我原来的问题中回答我的具体问题吗?
      【解决方案3】:

      使用 POST 创建实体,使用 PUT(或用于部分更新的 PATCH)更新实体。

      如果您的实体没有稳定的唯一标识符,则表明您无法引用特定实体,您应该使用 POST。

      【讨论】:

      • 我的实体有稳定的标识符,但是保存时,正在保存的实体的子实体也会更新,子实体的标识符会发生变化。您能否尝试从原始问题中回答我的具体问题?
      猜你喜欢
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 2013-11-29
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多