Прежде всего, перевод денег - это то, что вы не можете сделать за один вызов ресурса. Действие, которое вы хотите сделать, это отправка денег. Таким образом, вы добавляете ресурс для перевода денег на счет отправителя.
POST: accounts/alice, new Transfer {target:"BOB", abmount:100, currency:"CHF"}.
Готово. Вам не нужно знать, что это транзакция, которая должна быть атомарной и т. Д. Вы просто переводите деньги иначе. отправить деньги от А до Б.
Но для редких случаев здесь общее решение:
Если вы хотите сделать что-то очень сложное, включающее много ресурсов в определенном контексте с множеством ограничений, которые фактически пересекают барьер «что против того, почему» (знание бизнеса и внедрения), вам нужно перенести состояние. Поскольку REST не должен содержать состояния, вам, как клиенту, необходимо перенести состояние в другое.
Если вы передаете состояние, вам нужно скрыть информацию внутри от клиента. Клиент не должен знать внутреннюю информацию, необходимую только для реализации, но не несет информацию, относящуюся к бизнесу. Если эта информация не имеет деловой ценности, состояние должно быть зашифровано и должна использоваться метафора, такая как токен, пароль или что-то еще.
Таким образом, можно передавать внутреннее состояние, используя шифрование и подписывание системы, и при этом быть в целости и сохранности. Поиск правильной абстракции для клиента, почему он передает информацию о состоянии, зависит от дизайна и архитектуры.
Реальное решение:
Помните, что REST говорит о HTTP, а HTTP идет с концепцией использования куки. Эти куки часто забываются, когда люди говорят о REST API, рабочих процессах и взаимодействиях, охватывающих несколько ресурсов или запросов.
Помните, что написано в Википедии о HTTP-куки:
Файлы cookie были разработаны для того, чтобы веб-сайты могли надежно запоминать информацию о состоянии (например, элементы в корзине) или записывать действия пользователя по просмотру (включая нажатие на определенные кнопки, вход в систему или запись страниц, которые посетитель посетил до сих пор). назад, как месяцы или годы назад).
В общем, если вам нужно передать состояние, используйте куки. Он разработан по той же самой причине, это HTTP, и поэтому он совместим с REST по дизайну :).
Лучшее решение:
Если вы говорите о клиенте, выполняющем рабочий процесс с несколькими запросами, вы обычно говорите о протоколе. Каждая форма протокола поставляется с набором предварительных условий для каждого потенциального шага, например, выполнить шаг A, прежде чем вы сможете выполнить B.
Это естественно, но раскрытие протокола клиентам усложняет все. Чтобы избежать этого, просто подумайте, что мы делаем, когда нам приходится делать сложные взаимодействия и вещи в реальном мире ... Мы используем агента.
Используя метафору Агента, вы можете предоставить ресурс, который может выполнить все необходимые для вас действия, и сохранить фактическое назначение / инструкции, на которые он действует, в своем списке (чтобы мы могли использовать POST для агента или «агентства»).
Сложный пример:
Покупка дома:
Вам необходимо доказать свою правдоподобность (например, предоставить записи в суде), вам необходимо предоставить финансовые реквизиты, вам нужно купить реальный дом у адвоката и доверенной третьей стороны, хранящей средства, убедиться, что дом теперь принадлежит вам, и добавьте информацию о покупках в свои налоговые отчеты и т. д. (например, некоторые шаги могут быть неправильными или что-то в этом роде).
Эти шаги могут занять несколько дней, некоторые могут быть выполнены параллельно и т. Д.
Для этого вы просто даете агенту задание купить дом вроде:
POST: agency.com/ { task: "buy house", target:"link:toHouse", credibilities:"IamMe"}.
Готово. Агентство отправляет вам обратно ссылку, которую вы можете использовать для просмотра и отслеживания статуса этой работы, а все остальное выполняется агентами агентства автоматически.
Подумайте о трекере ошибок, например. В основном вы сообщаете об ошибке и можете использовать идентификатор ошибки, чтобы проверить, что происходит. Вы даже можете использовать сервис для прослушивания изменений этого ресурса. Миссия выполнена.