我正在使用 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)
我用这种方法看到的问题是它需要向服务器发送两个请求才能执行创建新 PERSON 资源的单个操作。这会产生性能问题,增加用户等待客户端完成其请求的机会。
我一直在尝试消除第一步的想法,例如在每个请求中预先发送事务 ID,但我的大多数想法都有其他问题或涉及牺牲应用程序的无状态性。
有没有办法做到这一点?
编辑::::::
我们最终采用的解决方案是让客户端获取 UUID 并将其与请求一起发送。UUID 是一个非常大的数字,占用 16 个字节 (2^128) 的空间。与具有编程头脑的人可能直观地认为的相反,随机生成 UUID 并假设它是唯一值是公认的做法。这是因为可能值的数量如此之大,以至于随机生成两个相同数字的几率低到几乎不可能。
一个警告是我们让我们的客户从服务器请求一个 UUID ( GET uuid/
)。这是因为我们无法保证客户端运行的环境。如果出现问题,例如在客户端上播种随机数生成器,那么很可能会发生 UUID 冲突。