将POST和PUT混合用于休息服务中的更新

时间:2017-05-17 13:26:56

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

我知道这可能是关于这个问题的一个主题,但我无法找到我的具体问题的答案。

我们有一个内部讨论是否在我们的休息服务中使用PUT进行更新。我们同意使用PUT有偏好。但是,PUT需要是幂等的。这是否意味着我们应该根据其幂等性将POST和PUT谓词混合用于不同的更新路由?

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

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

简而言之:

  • 根据它们是否是幂等的,将PUT和POST混合用于更新路由是个好主意吗?
  • 或者动词的一致性是否胜过幂等规则,我们应该只将PUT用于所有更新路由吗?
  • 或者应该放弃使用PUT的想法并在任何地方使用POST以避免混淆?

3 个答案:

答案 0 :(得分:1)

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

  • 将POST和PUT混合进行更新并不是一个好主意,它会让消费者感到困惑
  • 一致性胜过PUT的幂等规则
  • 因为人们习惯使用PUT进行更新,所以在任何地方使用帖子都不是一个好主意

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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

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