Як споживати зовнішній API RESTful з Symfony?


10

Ми будуємо архітектуру мікросервісу для наших проектів, в основному додатки Symfony взаємодіють із задніми API RESTful.

Проблема полягає в тому, що такий підхід полягає в порушенні управління сутністю Symfony, що значною мірою покладається на доктрину з базою даних. Там, де Symfony зазвичай обробляє об'єкти за допомогою Doctrine, що автоматизує більшу частину роботи, це неможливо легко відтворити, коли нам потрібно отримати доступ до зовнішніх даних з API.

Наприклад, з юридичною особою-клієнтом:

  • Використовуючи Doctrine, ми просто повинні визначити наш клас клієнта, і його зараз легко створювати, оновлювати, отримувати клієнтів.
  • Використовуючи підхід REST API, клієнтам доступні через API, але у нас є багато роботи, щоб визначити, як створюється клієнт (POST), оновлюється (PUT), отримується (GET) тощо.

Зауважимо, що клієнти використовують декілька додатків, а не лише передній додаток, отже, і спеціалізований API.

Чи варто створювати класи з сутнісними методами, які приховують складність викликів API, імпортують усі дані API локально та отримують доступ до них через Doctrine чи будь-яким іншим способом?


Я в тому ж човні, що і ти. Споживання зовнішніх API з клієнтами, створеними завдяки специфікаціям OpenApi / Swagger. Замислюючись про найкращі практики щодо "життєвого циклу" споживання, грубих операцій, параметрів та формування фільтру. В даний час я розширюю свій пошук, щоб включити будь-які підходи, незалежно від того, характерний він для Symfony чи ні.
вище за течією

Пропрацювавши над цією проблемою кілька місяців і повернувшись до цього питання, обидві відповіді поки що дають аналогічне рішення: абстрагування api-дзвінків з попою. Ось так ми і закінчилися з використанням, хоча існують і інші рішення. У подібних контекстах зв'язку Webapp <> API використання хорошого рішення з використанням приховування викликів API від рівня абстракції від Webapp. З наростанням мікросервісів та підходів, що ведуть API, без сумнівів, найкращі практики та інструменти з'являться для вирішення того, що, як видається, є загальною проблемою.
П’єр Б.

Тут застосовано подібний підхід. Тепер бізнес-логіка міститься в шарі "action", якому не важливо, чи це apti REST або команда cli, яка викликає його. Шестикутна конструкція Алістера Кокберна
вище за течією

Відповіді:


2

Я створив проект на основі символів, який використовує зовнішній API (JSON); що я зробив, це створити незалежну бібліотеку клієнтів ("бібліотека клієнтів" - фрагмент програмного забезпечення, композиторський пакет) з власним набором сутностей (POPO); вона інтегрується в основу, використовуючи інтерфейси, надані Symfony (наприклад, шляхом простого створення користувацького провайдера ).

Клієнт здійснює http-дзвінки "поза кадром" - це важливо для майбутніх можливостей тестування. Ви не хочете виставляти спосіб спілкування зі своїм джерелом даних, а також не хочете, щоб ваші тести покладалися на живі програми.

Інтерфейс бібліотеки клієнтів (наприклад, як це може виглядати):

class ApiClient {

   /**
    * @throws SomeApiException If credentials are invalid
    * @return ApiUser
    */
   public function authenticate($username, $password);

   /**
    * @return ApiUser
    */
   public function findUserByEmail($email);

   /**
    * @throws SomeApiException If email is invalid
    * @return void
    */
   public function changeUserEmail(User $user, $newEmail);
}

Клієнтська бібліотека внутрішньо використовує Guzzle для зв'язку та компонента кеш-доктрини для кешування результатів. Відображення між об’єктними об'єктами та json було зроблено картографами, що колись написане - не змінювалося дуже часто (або подія взагалі). У цьому випадку я б запропонував використовувати JMS Serializer для автоматизованого перетворення в JSON і з нього (я припускаю, що ви використовуєте JSON).

Вам знадобиться хороший механізм кешування та локальне зберігання, як-от Redis. Здійснення api-дзвінків на кожен запит програми вбиває ваш сервер і різко уповільнить вашу програму. Дуже важливо зрозуміти, як працюють кеші http. Якщо ваш api не використовує заголовки кешування (або використовує його незрозуміло), слідкувати за змінами буде дуже важко і забирає ресурси.

Ви також захочете подумати про те, як повинен вести себе клієнт, якщо з'єднання розривається - чи повинен клієнт використовувати засторожені дані? Було б непогано використовувати проксі-сервер між вашим додатком та API. У цьому випадку проксі (наприклад, лак) може пришвидшити ваші запити, а також оновити застарілі дані у фоновому режимі, не сповільнюючи додаток. Він також буде підтримувати ваш веб-сайт в Інтернеті у разі відмови API. Ти можеш не зможеш записати дані тим часом, але ваші користувачі все одно зможуть переглядати кешовані дані.

А кажучи про Вчення, дивіться " Закон інструменту ".


1

Доктрина - рівень доступу до бази даних. Ви не хочете отримувати доступ до бази даних, але apis. Ви все ще можете створити Entity, але потім як простий об’єкт, який не повинен нічого розширювати нашої програми (popo). Він повинен мати сховище, яке реалізує всі методи CRUD. У цьому випадку виклики в API замість бази даних. Я б створив для цього інтерфейс. Для використання вашої програми не повинно відчуватися інакше, за винятком того, що ви повинні враховувати всюди, коли мікрослужба може не відповідати.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.