在REST - revertable DELETE中,给出了关于如何在REST中建模状态变化的精彩介绍。基本上,如果您的资源具有字段 status ,则只需将该资源的新版本放入更新 status 字段。
在本主题中,我想扩展此模型。假设您有一个可以处于两种状态的资源:1和2.与引用帖子中描述的简单模型相比,有三个转换从状态1遍历到状态2,而不是仅仅一个。
我的问题是:您将如何在REST中模拟状态转换?
我自己无法想出一个类似RPC的POST,它可能不是很好的REST:
POST http://server/api/x
target_state=2&transition=3
这通过使用转换3将资源 x 从状态1更改为状态2.
答案 0 :(得分:2)
这并不仅限于REST;这是关于状态机的一个基本问题。状态机应该封装所有状态,这样如果你发现自己创建了从一个状态到另一个状态的多个转换,并且差异很大,那么这个差异也必须在状态中捕获。
例如,说我没有家。我可以通过三种方式从“无家可归”状态转变为“家庭”状态:我可以租一个,我可以买一个,我可以偷一个。从“无家可归者”到“家庭”的三次转变?不在机器的世界里。要么差异很大,要么不是。如果他们不是,那么在机器上根本没有任何区别。仅仅把“家”的新状态。如果是,那么我们需要扩展我们的国家概念以包含差异。例如:
homeless
A A A
/ | \
V | V
possessor <--|--- renter
A | /
\ | /
V V V
owner
我可以通过偷房子从无家可归者搬到拥有者那里。如果我长时间蹲下,我可能成为主人。或者我可以无家可归,租房子,甚至租房子。或者我可以直接买一个。所有三条路径都让我进入“所有者”状态,但它们使用中间状态来表示明显不同的过渡。
如果你想代表“无家可归者”与“在家里”(拥有者|承租人|所有者),那么将它作为一个只读的计算资源本身就没有问题。只是不要让任何人PUT / POST,因为过渡是模棱两可的。如果状态是重要的,那么将状态转换的历史保留为一组额外的资源也没有问题。