【问题标题】:REST - model state transitionsREST - 模型状态转换
【发布时间】:2011-07-21 12:41:18
【问题描述】:

REST - revertable DELETE 中给出了关于如何在 REST 中对状态变化进行建模的精彩介绍。基本上,如果您有一个带有 status 字段的资源,您只需将该资源的新版本添加一个更新 status 字段即可。

在这个主题中,我想扩展这个模型。假设您有一个可以处于两种状态的资源:1 和 2。与引用的帖子中描述的简单模型相比,从状态 1 到状态 2 的转换有三个,而不是只有一个。

我的问题是:如何在 REST 中模拟状态转换?

我自己无法提出类似 RPC 的 POST,这可能不是非常 RESTian:

POST http://server/api/x
     target_state=2&transition=3

这通过使用转换 3 将资源 x 从状态 1 更改为状态 2。

【问题讨论】:

    标签: rest transition state-machine


    【解决方案1】:

    这并不仅限于 REST;这更像是一个关于状态机的基本问题。状态机应该封装所有状态,因此如果您发现自己创建了从一种状态到另一种状态的多次转换,并且差异很大,那么也必须在状态中捕获这种差异。

    例如,假设我没有家。我可以通过三种方式从“无家可归”状态转移到“家”状态:我可以租一个,我可以买一个,我可以偷一个。从“无家可归”到“家”的三个转变?不在机器的世界里。差异要么显着,要么不显着。如果不是,那么对于机器来说,根本没有必要进行区分。只是把“家”的新状态。如果是,那么我们需要扩展我们的状态概念以包含差异。例如:

             homeless
            A    A   A
           /     |    \
          V      |     V
    possessor <--|---  renter
           A     |    /
            \    |   /
             V   V  V
               owner
    

    我可以通过偷房子从无家可归者变成拥有者。如果我蹲得够久,我可能会成为它的主人。或者我可以无家可归并租房子,甚至是先租后买。或者我可以直接买一个。所有三个路径都让我进入“所有者”状态,但它们使用中间状态来表示显着不同的转换。

    如果您想要表示“无家可归者”与“在家中”(所有者|租户|所有者),那么将其公开为只读的、计算的资源本身就没有问题。只是不要让任何人对它进行 PUT/POST,因为转换是模棱两可的。如果状态很重要,将状态转换的历史记录作为一组额外的资源保存也没有问题。

    【讨论】:

    • 首先,非常感谢您的详细回答。很酷。但我仍然不相信每个转换都可以很容易地建模为一个状态。我认为中间状态和永久状态之间存在巨大差异。你涵盖了第二组。关于第一组,举个例子:假设你可以通过 3 种方式从无家可归者转变为占有者:你支付它,你继承它或者你在彩票中赢得它。您是否也将其建模为单独的状态?这不是“仅仅为了将不同的转换表示为状态”而导致状态的爆炸吗?你怎么看?
    • [“拥有者”是指“被盗”。如果您为此付费或中奖,则您处于“所有者”状态。] 如果您的应用程序采用哪条路径很重要,那么是的,您应该使用中间状态,创建新的终端状态,或者添加表示差异的附加状态(如抵押资源)。
    • 好吧,有道理。我只害怕由所有可能转换的叉积产生的“虚拟”状态的爆炸式增长。
    • @ZureCitroen - 同样,它最终归结为您关心的内容。如果您实际上关心所有转换的叉积中的每个虚拟状态,那么您应该将转换转换为状态。如果您不关心它们,那么它们只是过渡。在状态机中,状态很重要,而不是转换。过渡只是达到目的的手段。
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多