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