REST - модель переходов состояний - PullRequest
5 голосов
/ 21 июля 2011

В REST - обратимый DELETE было дано хорошее введение в то, как изменения состояния модели в REST.По сути, если у вас есть ресурс с полем status , вы просто помещаете новую версию этого ресурса с полем status обновления.

В этом разделе яхотел бы расширить эту модель.Допустим, у вас есть ресурс, который может находиться в двух состояниях: 1 и 2. В отличие от простой модели, описанной в цитируемом посте, существует три перехода для перехода из состояния 1 в состояние 2 вместо одного.

Мой вопрос: как бы вы смоделировали переходы состояний в REST?

Я сам не могу придумать RPC-подобный POST, который, вероятно, не очень RESTian:

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

Изменяет ресурс x из состояния 1 в состояние 2, используя переход 3.

1 Ответ

2 голосов
/ 21 июля 2011

Это не ограничивается REST;это больше основной вопрос о конечных автоматах.Конечный автомат должен инкапсулировать все состояния, так что если вы обнаружите, что создаете несколько переходов из одного состояния в другое, и разница значительна, то эта разница также должна быть зафиксирована в состоянии.

Например,Скажи, у меня нет дома.Я могу перейти из «бездомного» в «домашнее» состояние тремя способами: я могу арендовать один, я могу купить один, я могу украсть один.Три перехода из «бездомного» в «дом»?Не в мире машин.Либо различия значительны, либо нет.Если это не так, то для машины нет никакого смысла делать различие вообще.Просто поставь новый статус "дома".Если это так, то нам нужно расширить нашу концепцию государства, чтобы охватить различия.Например:

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

Я могу перейти от бездомного к владельцу, украдя дом.Если я приседаю на ней достаточно долго, я могу стать ее владельцем.Или я могу быть бездомным и снимать дом, или даже сдавать в аренду.Или я мог бы купить сразу.Все три пути приводят меня в состояние «владелец», но они используют промежуточные состояния для представления существенно разных переходов.

Если затем вы хотите представить «бездомный» против «в доме» (owner | renter| владелец), нет проблем с представлением этого ресурса как доступного только для чтения.Просто не позволяйте никому PUT / POST, так как переход неоднозначен.Также нет проблем с сохранением истории переходов состояний в качестве дополнительного набора ресурсов, если это состояние является значимым.

...