独特的键是否会破坏POST非幂等性?

问题描述 投票:0回答:1

我读了很多关于幂等和非幂等的内容,我认为我清楚地理解了这个概念。然而,虽然POST的情况令我感到困惑。

POST应始终创建新资源。例如:

  1. POST api/persons { Name: "John" } --> persons/1
  2. POST api/persons { Name: "Jack" } --> persons/2
  3. POST api/persons { Name: "Jack" } --> persons/3

现在这很明显,但是让我们说一个人有一个ID作为PK,而且SSN也是一个独特的密钥。在这种情况下,如果我使用相同的SSN发送两个POST请求,则不会创建两个新资源:

  1. POST api/persons { Name: "John", SSN: 123 } --> persons/1
  2. POST api/persons { Name: "Jack", SSN: 123 } --> error

请注意,我没有发送ID PK,因此理论上,POST应该将其视为新资源并创建它。

这会破坏REST POST非幂等标准吗?

rest post primary-key unique-key idempotent
1个回答
1
投票

POST应始终创建新资源。

这是一种误解 - 您可以将POST用于其他目的。它故意非常通用。

这会破坏REST POST非幂等标准吗?

不,因为POST不需要是非幂等的。

例如,假设我们想要提供一个允许使用者查询数据库中信息的Web API。由于操作“基本上是只读”,我们可以使用带有safe语义的消息。

我们通常会使用GET,并使用查询字符串来描述查询的参数。

但是对URI的长度存在事实上的限制,因此限制了查询的长度。如果我们需要支持超过这些限制的查询,我们唯一的选择是将参数移动到请求体中。

标准的“安全”HTTP方法没有为请求体定义明确的语义。

因此,为了确保正确的行为,我们使用POST而不是GET。服务器上的效果仍然“基本上只读”,但只能看到消息(而不是我们的带外API文档)的通用组件将不知道消息是安全的,并且无法执行优化(使用安全方法时可用的缓存,自动重新发送,爬网)。

换句话说,我们在HTTP中所做的一切都可以通过POST来完成 - 其他方法的作用是让我们解锁消息的通用消费者/观察者的优化。

实际上,HTTP根本不限制实现 - 它描述了语义。这是Roy Fielding在2002年解释:

HTTP不会尝试要求GET的结果是安全的。它的作用是要求操作的语义是安全的,因此它是实现的错误,而不是接口或接口的用户,如果发生任何导致财产损失的结果(金钱,BTW,为了这个定义,它被认为是财产。

POST不承诺是幂等的,因此如果客户认为它确实做出了承诺,那么客户就会被破坏。

© www.soinside.com 2019 - 2024. All rights reserved.