2011-07-21 14 views
5

W REST - revertable DELETE podano ładne wprowadzenie do opisu zmian stanu modelu w REST. Zasadniczo, jeśli masz zasób z polem o statusie, po prostu umieść nową wersję tego zasobu z polem aktualizacyjnym o statusie.REST - przejścia modelu stanowego

W tym temacie chciałbym rozszerzyć ten model. Załóżmy, że masz zasób, który może być w dwóch stanach: 1 i 2. W przeciwieństwie do prostego modelu opisanego w cytowanym poście, istnieją trzy przejścia do przechodzenia od stanu 1 do stanu 2, zamiast tylko jednego.

Moje pytanie brzmi: w jaki sposób modelujesz przejścia stanu w trybie REST?

ja nie mogę wymyślić POST RPC-like, co nie jest bardzo RESTian prawdopodobnie:

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

To zmienia zasobu x od stanu 1 do stanu 2 przy użyciu przejścia 3.

Odpowiedz

2

To naprawdę nie jest ograniczone do REST; to bardziej podstawowe pytanie o maszyny stanu. Maszyna stanu powinna hermetyzować cały stan, tak więc jeśli zauważysz, że tworzysz wiele przejść z jednego stanu do innego, a różnica jest znacząca, to ta różnica musi zostać przechwycona w stanie.

Na przykład powiedz, że nie mam domu. Mogę przejść od stanu "bezdomny" do stanu "domu" na trzy sposoby: mogę wynająć jedno, mogę je kupić, mogę ukraść. Trzy przejścia od "bezdomnych" do "domu"? Nie w świecie maszyn. Albo różnice są znaczące, albo nie. Jeśli nie, to do maszyny nie ma sensu robić rozróżnienia. Po prostu PUT nowy status "domu". Jeśli tak, to musimy rozszerzyć naszą koncepcję państwa, aby objąć różnice. Na przykład:

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

mogę przejść od bezdomnych do posiadacza o kradzież dom. Jeśli będę się tak długo kucał, mogę zostać właścicielem. Albo mogę być bezdomny i wynająć dom, a nawet wynająć do domu. Albo mógłbym kupić od razu. Wszystkie trzy ścieżki prowadzą mnie do stanu "właściciela", ale używają stanów pośrednich do reprezentowania znacząco różnych przejść.

Jeśli chcesz reprezentować "bezdomnego" w porównaniu z "w domu" (posiadacz | najemca | właściciela), nie ma problemu z ujawnieniem go jako samodzielnego, obliczonego zasobu. Po prostu nie pozwól nikomu PUT/POST na to, ponieważ przejście jest niejednoznaczne. Nie ma również problemu z utrzymywaniem historii przejść między stanami jako dodatkowym zbiorem zasobów, jeśli ten stan jest znaczący.

+0

Po pierwsze, bardzo dziękuję za szczegółową odpowiedź. Bardzo fajny. Ale nadal nie jestem przekonany, że każde przejście można łatwo modelować jako stan. Myślę, że istnieje ogromna różnica między państwami pośrednimi a stanami stałymi. Obejmowałeś drugą grupę. O pierwszej grupie, na przykład: powiedz, że możesz przemieścić się z bezdomnego do posiadacza na 3 sposoby: płacisz za to, odziedziczysz lub wygrywasz w loterii. Czy zamierzasz również modelować to jako oddzielne stany? Czy to nie prowadzi do eksplozji stanów "tylko po to, by reprezentować różne przejścia jako stany"? Jak to widzisz? –

+0

[Przez "posiadacza" miałem na myśli "skradziony". Jeśli płacisz za to lub wygrywasz w loterii, jesteś w stanie "właściciela".] Jeśli ma znaczenie dla twojej aplikacji, która ścieżka jest brana, to tak, powinieneś albo zatrudniać stany pośrednie, tworzyć nowe stany końcowe, albo dodawać dodatkowy stan (jak zasób hipoteki) do reprezentowania różnic. – fumanchu

+0

W porządku, ma sens. Obawiam się jedynie eksplozji stanów "wirtualnych", generowanych przez iloczyn krzyżowy wszystkich możliwych przejść. –