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