如何使用服务器定义的ID构建REST API?

时间:2014-12-22 13:17:29

标签: api rest idempotent

这是我在应用程序中创建资源的经典REST方法:

# This creates user. Client is responsible to create UUID, which is simple
PUT /users/CLIENT_GENERATED_UUID
# Access user by uuid
GET /users/UUID

当我们触及数据存储性能领域时,发现随机生成的UUID由于数据局部性等多种原因而无法正常运行。

服务器生成的ID有利于提高性能,但它们并不真正匹配REST:

  1. 如果使用POST创建资源,则会失去幂等性:REST会隐含PUT,GET,DELETE idempotency,而POST则不会。​​
  2. 您可以要求服务器在进行PUT之前为您提供一个很好的ID。虽然它感觉非常沉重且不明显,但它也不能保护使用自己的随机ID而不是要求它的虚拟客户端。
  3. 有人可以在这个架构问题上给我一个暗示吗?

3 个答案:

答案 0 :(得分:5)

创建资源并不意味着是幂等的。如果服务器分配ID,则必须为要创建的每个资源选择不同的ID。这样的操作不能是幂等的,重复它必须创建一个不同的资源。

中的collecton资源使用POST
POST /users
如果服务器分配ID,则

完全是RESTful。此请求可以重复,它将创建不同的资源。

如果问题域允许客户端控制ID,则使用PUT之类的幂等操作来创建资源才有意义。我认为对大多数域名来说并非如此。

我的建议:使用POST并让服务器分配ID。

答案 1 :(得分:1)

实际上,当您阅读RESTful最佳实践时,您可以找到:

  

POST动词最常用于创建新资源。

另外:

  

在客户端而不是服务器选择资源ID的情况下,PUT也可用于创建资源。

答案 2 :(得分:0)

在REST环境中,您发送POST以创建资源,并且可以返回服务器生成的ID,以便在使用PUT或PATCH之后发送值。

POST /users
PUT /users/id

此外,人们使用客户端生成的ID

通过PUT创建资源
PUT /users

但我认为最好的方法是使用服务器生成的ID与POST。

以下是一个明确的解释:http://www.restapitutorial.com/lessons/httpmethods.html