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

如何使用服务器定义的ID构建RESTAPI?,api,rest,idempotent,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 当我们触及数据存储性能领域时,发现随机生成的UUID由于许多原因(如数据局部性)不能很好地发挥作用 服务器生成的ID对性能很好,但与REST不匹配: 如果使

这是创建应用程序中资源的经典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
当我们触及数据存储性能领域时,发现随机生成的UUID由于许多原因(如数据局部性)不能很好地发挥作用

服务器生成的ID对性能很好,但与REST不匹配:

  • 如果使用POST创建资源,则会丢失幂等性:REST暗示了PUT、GET、DELETE幂等性,而POST则不是
  • 在执行PUT之前,您可以要求服务器为您提供一个好的ID。尽管它感觉非常沉重和不明显,但它也不能保护使用自己的随机id而不是请求它的虚拟客户机

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

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

    对collecton资源使用
    POST
    ,如中所示

    POST /users
    
    如果服务器分配ID,则为完全RESTful。此请求可以重复,并将创建不同的资源

    只有当问题域允许客户端控制ID时,使用诸如
    PUT
    之类的幂等运算来创建资源才有意义。我认为对于大多数域来说,这是不正确的


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

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

    POST /users
    PUT /users/id
    
    此外,人们使用客户机生成的ID使用PUT创建资源

    PUT /users
    
    但我认为最好的方法是使用服务器生成的ID和POST


    这里有一个明确的解释:

    实际上,当您阅读RESTful最佳实践时,您会发现:

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

    除此之外:

    如果资源ID由客户端而不是服务器选择,则PUT还可用于创建资源


    你能提供这个报价的来源吗?但我可能引用了这个文件的不同版本,因为我当时使用的是不同的笔记本电脑。。。