【发布时间】:2013-05-21 00:26:31
【问题描述】:
我正在使用 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 并假设它是唯一值是公认的做法。这是因为可能值的数量如此之多,以至于随机生成两个相同数字的几率低到几乎不可能。
需要注意的是,我们正在让我们的客户从服务器 (GET uuid/) 请求一个 UUID。这是因为我们无法保证客户端运行的环境。如果出现问题,例如在客户端上播种随机数生成器,那么很可能是 UUID 冲突。
【问题讨论】:
标签: rest idempotent