2011-07-21 105 views
5

REST - revertable DELETE給出了一個關於如何在REST中對狀態進行模型更改的很好的介紹。基本上,如果您有一個狀態爲的資源,則只需將該資源的新版本與更新狀態字段配合使用。REST - 模型狀態轉換

在這個話題中,我想擴展這個模型。假設您有一種資源可以處於兩種狀態:1和2.與所引用的文章中描述的簡單模式相比,有三種從狀態1轉換到狀態2的轉換,而不是一種轉換。

我的問題是:你將如何在REST中建模狀態轉換?

我自己不能拿出一個類似於RPC的POST,這是不是很可能RESTian:通過使用過渡3.

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

這改變了資源X從狀態1到狀態2

回答

2

這並不僅限於REST;這更多的是關於狀態機的一個基本問題。狀態機應該封裝所有的狀態,所以如果你發現自己創建了從一個狀態到另一個狀態的多重轉換,並且差異很大,那麼這個差異也必須在狀態中被捕獲。

例如,說我沒有家。我可以用三種方式從「無家可歸」狀態轉移到「家」狀態:我可以租一個,我可以買一個,我可以偷一個。從「無家可歸」到「家」有三種轉變?不在機器世界。要麼差異顯着,要麼不是。如果它們不是,那麼對於機器而言根本就沒有任何意義。僅僅是「家」的新狀態。如果是的話,那麼我們就需要擴大我們的國家概念以涵蓋差異。例如:

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

我可以通過偷房子從無家可歸者遷移到擁有者。如果我蹲下足夠長的時間,我可能會成爲主人。或者我可能無家可歸,租房子,甚至租房子。或者我可以直接買一個。所有三條路徑都讓我進入「所有者」狀態,但他們使用中間狀態來表示顯着不同的轉換。

如果您希望代表「無家可歸」與「在家中」(佔有者|所有者),那麼將它作爲只讀,計算資源本身是沒有問題的。只是不要讓任何人PUT/POST,因爲過渡是不明確的。如果狀態很重要,將狀態轉換的歷史記錄保存爲一組額外的資源也沒有問題。

+0

首先,非常感謝您的詳細解答。很酷。但是我仍然不確定每一次轉換都可以很容易地模擬爲一個狀態。我認爲中間國家和永久國家之間存在巨大差異。你覆蓋了第二組。關於第一組,舉一個例子:假設你可以通過3種方式從無家可歸者走向姿勢:你爲此付出代價,你繼承,或者你在一次樂透中獲勝。你是否也將這個模型作爲單獨的狀態進行建模?這是不是導致了國家的爆炸「只是爲了代表不同的國家的過渡?你怎麼看? –

+0

[「擁有者」我的意思是「被盜」。如果您爲此付費或在彩票中獲勝,那麼您處於「所有者」狀態。]如果您的應用程序對您的應用程序採取了哪條路徑,那麼是的,您應該採用中間狀態,創建新的終端狀態或添加額外的狀態(如抵押資源)來表示差異。 – fumanchu

+0

好吧,有道理。我只害怕由所有可能的過渡產物產生的「虛擬」狀態爆發。 –