REST - 模型状态转换

标签 rest transition state-machine

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/

相关文章:

javascript - 向左绘制时 d3 行转换失败

iphone - 对 UITabBarController 的开始/结束外观转换的调用不平衡

UML 状态机 - 具有入口事件的复合状态中的显式入口

jquery - 如何使用 $.ajax(jQuery 或 Zepto)发布对象数组

authentication - 以 RESTful 方式许可和 session

python - 将图像保存在base64 django Rest框架中

ios - 设置 NavigationController.Viewcontrollers 崩溃(使用自定义转换)

recursion - 如何使用表示状态的函数在 F# 中获得工作状态机?

c++ - 如何在状态中创建状态机?

spring - 使用不同的@QueryParams 重载路径函数