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

sno*_*ndy 2 api rest idempotent

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

# This creates user. Client is responsible to create UUID, which is simple
PUT /users/CLIENT_GENERATED_UUID
# Access user by uuid
GET /users/UUID
Run Code Online (Sandbox Code Playgroud)

当我们触及数据存储性能领域时,事实证明随机生成的UUID由于数据局部性等多种原因而无法很好地发挥作用.

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

  1. 如果使用POST来创建资源,则会失去幂等性:REST隐含PUT,GET,DELETE idempotency,而POST则不然.
  2. 在进行PUT之前,您可以要求服务器为您提供一个很好的ID.尽管它感觉非常沉重且不明显,但它也不能保护使用自己的随机ID而不是要求它的虚拟客户端.

有人能在这个架构问题上给我一个暗示吗?

小智 5

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

像对象一样使用POSTcollecton资源

POST /users
Run Code Online (Sandbox Code Playgroud)

如果服务器分配ID,则完全是RESTful.可以重复此请求,它将创建不同的资源.

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

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