Тут є кілька хороших відповідей, але я не впевнений, що вони допоможуть вам переконати своїх колег. Як багато хто зазначав, те, що ви пропонуєте, не є відхиленням від дизайну RESTful, і я думаю, що це ключове значення для того, щоб отримати їх на борт із вашою пропозицією.
REST не в тому, щоб переконатися, що ваш API дозволяє зберігати та отримувати дані. Скоріше, це стосується моделювання дій як ресурсів. Ваш API повинен дозволяти вживати дій ( зрештою, це інтерфейс програмування додатків). Питання в тому, як моделювати ці дії.
Замість того, щоб придумати термін, приклади, мабуть, є найкращим способом пояснити це своїм колегам . Таким чином ви можете показати, як вони це роблять зараз, які проблеми це спричиняє, рішення, яке вирішує проблему, і як вона все ще залишається RESTful.
Давайте подивимось на ваш об’єкт Клієнта.
Проблема:
Користувальницький інтерфейс розміщує Клієнта, але наступні таблиці ще не були оновлені. Що робити, якщо один із наступних дзвінків не вдасться через помилку у вашому коді користувальницького інтерфейсу (або неправильно працює плагін браузера тощо)? Тепер ваші дані перебувають у несуперечливому стані. Це навіть може бути стан, який порушує інші частини вашого API чи інтерфейсу користувача, не кажучи вже про те, що він просто недійсний. Як ви одужуєте? Вам доведеться перевірити кожен можливий стан, щоб бути впевненим, що це щось не порушить, але важко буде знати, що можливо.
Рішення:
Створіть кінцеву точку API для створення клієнтів. Ви знаєте, що не хочете мати кінцеву точку "/ customer / create" або навіть "/ create-customer", оскільки create є дієсловом і порушує REST. Тож іменуйте це. "/ створення клієнтів" може працювати. Тепер, коли ви розмістите об’єкт CustomerCreation, він надішле всі необхідні поля, щоб клієнт був повністю створений. Кінцева точка гарантує, що дані будуть повноцінними та дійсними (повернення 400 або щось інше, якщо не вдалося перевірити), і може зберігатись, наприклад, у межах однієї db транзакції.
Якщо вам також потрібна кінцева точка для об’єктів GET / клієнт, це добре. Ви можете мати і те, і інше. Хитрість полягає у створенні кінцевих точок, які обслуговують потреби споживачів.
Переваги:
- Ви гарантуєте, що у вас не буде поганого стану
- На дисках інтерфейсу користувача насправді простіше, якщо їм не доведеться «знати» впорядкування запитів, проблеми з підтвердженням тощо
- Це не так балакуче API, скорочуючи затримку мережевих запитів
- Простіше тестувати та концептуалізувати сценарії (відсутні / неправильно сформовані фрагменти даних із інтерфейсу користувача не поширюються між запитами, деякі з яких можуть не працювати)
- Це дозволяє краще вкладати бізнес-логіку
- Як правило, безпека полегшується (тому що логіку бізнесу та оркестрування в інтерфейсі можуть змінювати користувачі)
- Це, ймовірно, зменшить дублювання логіки (швидше за все, ви матимете 2+ споживачів API, ніж 2+ API, які надають доступ до тих же даних)
- Ще 100% ВІДПОВІДНО
Недоліки:
- Це може бути більше роботи для бек-енд-дев (але може бути не в довгостроковій перспективі)
Людям може бути важко зрозуміти цю парадигму і що в ній хорошого, якщо вони не спробували її. Сподіваємось, ви можете допомогти їм побачити, використовуючи приклад із власного коду.
Мій власний досвід полягає в тому, що як тільки розробники моєї команди почали реалізовувати цю стратегію, вони майже одразу побачили переваги.
Подальше навчання:
Ця стаття з роздумів дійсно допомогла мені зрозуміти, як моделювати дії як об’єкти, використовуючи практичні приклади: https://www.thoughtworks.com/insights/blog/rest-api-design-resource-modeling
Я б також запропонував прочитати на CQRS та події Sourcing, оскільки вони стосуються саме подібних речей (тобто розлучення вашого API від фактичної логіки збереження). Я не знаю, наскільки готові ваші колеги будуть читати подібні речі, але це може дати вам більше ясності та допоможе вам пояснити їх.