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