我正在利用 ROA(面向资源的架构)设计一个 RESTful Web 服务。
我正在尝试找出一种有效的方法来保证 PUT 请求的幂等性,在服务器指定资源键的情况下创建新资源。
根据我的理解,传统的方法是创建一种事务资源,例如/CREATE_PERSON。创建新人员资源的客户端-服务器交互分为两部分:
第 1 步:获取用于创建新 PERSON 资源的唯一事务 ID:::
**Client request:**
POST /CREATE_PERSON
**Server response:**
200 OK
transaction-id:"as8yfasiob"
步骤 2:在请求中创建新的人员资源,并使用事务 id::: 保证其唯一性
**Client request**
PUT /CREATE_PERSON/{transaction_id}
first_name="Big bubba"
**Server response**
201 Created // (If the request is a duplicate, it would send this
PersonKey="398u4nsdf" // same response without creating a new resource. It
// would perhaps send an error response if the was used
// on a transaction id non-duplicate request, but I have
// control over the client, so I can guarantee that this
// won't happen)
我发现这种方法的问题是,它需要向服务器发送两个请求才能执行创建新人员资源的单个操作。这会产生性能问题,增加用户等待客户端完成其请求的机会。
我一直在尝试讨论消除第一步的想法,例如在每个请求中预先发送交易 ID,但我的大多数想法都有其他问题或涉及牺牲应用程序的无状态性。
有没有办法做到这一点?
编辑::::::
我们最终采用的解决方案是让客户端获取 UUID 并将其与请求一起发送。 UUID 是一个非常大的数字,占用 16 个字节(2^128)的空间。与具有编程思维的人的直觉想法相反,随机生成 UUID 并假设它是唯一值是公认的做法。这是因为可能值的数量如此之大,以至于随机生成两个相同数字的几率很低,几乎是不可能的。
需要注意的是,我们让客户端从服务器请求 UUID(GET uuid/
)。这是因为我们无法保证客户端运行的环境。如果存在诸如在客户端上播种随机数生成器之类的问题,那么很可能会发生 UUID 冲突。