混合 POST 和 PUT 以在休息服务中进行更新
mix POST and PUT for updates in rest service
我知道这可能是第 10 亿次关于此话题的讨论,但我找不到我的具体问题的答案。
我们正在内部讨论是否在我们的休息服务中使用 PUT 进行更新。我们同意优先使用 PUT。但是,PUT 需要是幂等的。这是否意味着我们应该根据幂等性为不同的更新路由混合使用 POST 和 PUT 动词?
举个具体的例子。我们有一个更新路线,更新,比方说 "car"。对于此更新路线,您可以(除其他事项外)传递一个超链接。此超链接在保存时将获得一个 ID,并将链接到更新的汽车。但是,每次更新汽车时,生成的超链接的 id 都会不同。这是否意味着更新不再是幂等的?即使超链接的实际目标相同?
如果是这样,我们应该使用 POST 动词进行此更新,而不是 PUT 动词。然而,我们还有许多其他的幂等更新路由。他们应该保留 PUT 吗?我相信这会让服务的消费者感到非常困惑。
简而言之:
- 将 PUT 和 POST 根据它们是否幂等混合用于更新路由是个好主意吗?
- 或者动词的一致性是否胜过幂等规则,我们应该简单地对所有更新路由使用 PUT 吗?
- 或者应该放弃使用 PUT 的想法并在所有地方使用 POST 来完全避免混淆?
使用POST创建实体并使用PUT(或PATCH进行部分更新)更新实体。
如果您的实体没有稳定的唯一标识符,则表明您不能指代特定实体,您应该使用 POST。
通常规则是,如果客户端知道它正在创建的资源的目标 URI,则始终首选 PUT
。 POST
在创建新资源方面很受欢迎,但这在很大程度上是因为许多 API 想要确定目标 URI(例如,如果您的数据库使用自动递增的 ID)。
我与 Whosebug 以外的人进行了一些讨论。我们得出以下结论:
- 混合使用 POST 和 PUT 进行更新不是一个好主意,这会让消费者感到困惑
- 一致性胜过 PUT 的幂等规则
- 到处使用 post 并不是一个好主意,因为人们习惯于使用 PUT 进行更新
理想情况下,我们会更改我们的代码(来自最初问题中的示例)以确保超链接的 ID 不会改变。在这种情况下,不会讨论使用 PUT 或 POST。如果我们不能这样做,我们将在 API 自述文件中写一个 "disclaimer" 以确保让人们知道一些 PUT 路由并不是真正幂等的
我知道这可能是第 10 亿次关于此话题的讨论,但我找不到我的具体问题的答案。
我们正在内部讨论是否在我们的休息服务中使用 PUT 进行更新。我们同意优先使用 PUT。但是,PUT 需要是幂等的。这是否意味着我们应该根据幂等性为不同的更新路由混合使用 POST 和 PUT 动词?
举个具体的例子。我们有一个更新路线,更新,比方说 "car"。对于此更新路线,您可以(除其他事项外)传递一个超链接。此超链接在保存时将获得一个 ID,并将链接到更新的汽车。但是,每次更新汽车时,生成的超链接的 id 都会不同。这是否意味着更新不再是幂等的?即使超链接的实际目标相同?
如果是这样,我们应该使用 POST 动词进行此更新,而不是 PUT 动词。然而,我们还有许多其他的幂等更新路由。他们应该保留 PUT 吗?我相信这会让服务的消费者感到非常困惑。
简而言之:
- 将 PUT 和 POST 根据它们是否幂等混合用于更新路由是个好主意吗?
- 或者动词的一致性是否胜过幂等规则,我们应该简单地对所有更新路由使用 PUT 吗?
- 或者应该放弃使用 PUT 的想法并在所有地方使用 POST 来完全避免混淆?
使用POST创建实体并使用PUT(或PATCH进行部分更新)更新实体。
如果您的实体没有稳定的唯一标识符,则表明您不能指代特定实体,您应该使用 POST。
通常规则是,如果客户端知道它正在创建的资源的目标 URI,则始终首选 PUT
。 POST
在创建新资源方面很受欢迎,但这在很大程度上是因为许多 API 想要确定目标 URI(例如,如果您的数据库使用自动递增的 ID)。
我与 Whosebug 以外的人进行了一些讨论。我们得出以下结论:
- 混合使用 POST 和 PUT 进行更新不是一个好主意,这会让消费者感到困惑
- 一致性胜过 PUT 的幂等规则
- 到处使用 post 并不是一个好主意,因为人们习惯于使用 PUT 进行更新
理想情况下,我们会更改我们的代码(来自最初问题中的示例)以确保超链接的 ID 不会改变。在这种情况下,不会讨论使用 PUT 或 POST。如果我们不能这样做,我们将在 API 自述文件中写一个 "disclaimer" 以确保让人们知道一些 PUT 路由并不是真正幂等的