Интеграция с Backend и внешними SDK
Интеграция с Backend и внешними SDK
Экран показывает заказ, но карта не загрузилась, статус доставки устарел, а повторное открытие приложения ничего не исправило. Где ошибка: в интерфейсе, на сервере или в стороннем сервисе? Интеграция считается законченной не тогда, когда данные однажды появились на экране, а когда приложение предсказуемо ведёт себя при успехе, задержке и сбое каждого участника.
Два источника возможностей приложения
Представьте ресторан: зал принимает заказ, кухня готовит блюдо, а курьерская служба доставляет его клиенту. Зал не должен готовить, а кухня — самостоятельно рисовать маршрут курьера. Аналогично Flutter-приложение координирует несколько самостоятельных частей.
Backend — серверная часть системы, которая хранит и обрабатывает данные, применяет правила бизнеса и отвечает на запросы приложения.
Например, Backend интернет-магазина определяет итоговую цену заказа, проверяет наличие товара и сохраняет новый адрес. Приложение показывает результат, но не должно считать окончательную стоимость по собственным, потенциально устаревшим правилам.
Чтобы посетитель ресторана не заходил на кухню и не объяснял заказ каждому повару, существует понятный способ передачи заказа. В программной системе эту роль выполняет API.
API, или application programming interface — интерфейс программирования приложений: правила, по которым одна программа отправляет другой запросы и получает ответы.
Правила определяют, какие сведения нужно передать, какой результат ожидать и как будет сообщено об ошибке. Например, приложение передаёт номер заказа, а Backend возвращает состояние доставки и предполагаемую дату прибытия.
Внешний сервис напоминает готовую курьерскую службу: команда приложения не строит собственную навигационную систему, а подключает уже созданную возможность.
SDK, или software development kit — комплект разработки программного обеспечения: готовый код и инструменты для подключения возможностей определённого сервиса или платформы.
SDK карты может показать маршрут, SDK уведомлений — связать устройство с доставкой сообщений. При этом сторонний код остаётся внешней зависимостью: его поведение, ограничения и обновления контролирует другая команда.
| Вопрос | Backend через API | Внешний SDK |
|---|---|---|
| Где выполняется основная работа | На удалённом сервере | В приложении и связанном внешнем сервисе |
| Что передаёт приложение | Запрос и необходимые данные | Команды, настройки или данные устройства |
| Что может нарушить работу | Недоступность сети, ошибка ответа, изменение правил | Ошибка запуска, запрет пользователя, изменение версии |
| Кто управляет системой | Команда продукта или партнёр | Поставщик SDK |
| Что обязан сделать Flutter-код | Отправить запрос и обработать любой ответ | Безопасно подключить возможность и обработать её результат |
Схема важна не ради стрелок, а ради границ ответственности. Backend не должен знать, как нарисован экран, SDK карты не должен определять состояние заказа, а интерфейс не должен самостоятельно придумывать серверные данные.
Как проходит одна пользовательская операция
Рассмотрим экран доставки заказа № 4821. Он должен показать статус посылки и её положение на карте.
- Пользователь открывает экран заказа.
- Приложение запрашивает через API данные заказа № 4821.
- Backend проверяет доступ пользователя и находит актуальный статус.
- Приложение получает статус «Передан курьеру» и координаты.
- Координаты передаются SDK карты.
- SDK отображает указанную точку, а Flutter-интерфейс объединяет карту со статусом.
Здесь участвуют две интеграции, но они не должны сливаться в одну неразделимую операцию. Если карта недоступна, текстовый статус заказа всё ещё полезен. Если Backend не вернул координаты, SDK карты не исправит отсутствие данных.
Такое разделение определяет поведение при частичном сбое:
- данные заказа получены, карта не работает — показать статус и понятное сообщение вместо карты;
- Backend недоступен — показать, что сведения временно не удалось обновить;
- заказ не существует — не повторять запрос бесконечно, а сообщить об отсутствии заказа;
- пользователь запретил доступ к возможности устройства — объяснить, зачем требуется разрешение, и оставить доступную часть экрана рабочей.
Договорённость важнее конкретного инструмента
Заказывая мебель, недостаточно сказать мастеру: «Сделайте шкаф». Нужно согласовать размеры, материалы и срок. В интеграции такую точность обеспечивает контракт.
Интеграционный контракт — точная договорённость о данных, допустимых запросах, результатах, ошибках и обязанностях взаимодействующих сторон.
Для API контракт отвечает как минимум на следующие вопросы:
- какие данные приложение обязано отправить;
- какие данные Backend возвращает при успехе;
- какие сведения могут отсутствовать;
- как различаются временная проблема и окончательный отказ;
- может ли один запрос быть безопасно повторён;
- какие изменения совместимы со старой версией приложения.
Для SDK набор вопросов немного другой:
- в какой момент его можно запускать;
- какие настройки ему необходимы;
- какие разрешения может выдать или запретить пользователь;
- что произойдёт, если внешний сервис недоступен;
- какие результаты приложение должно сохранить;
- как отключить возможность без поломки остального приложения.
Особенно опасно считать успешный ответ единственным сценарием. Мобильное приложение работает на устройствах с разной скоростью, настройками и качеством связи. Поэтому результат интеграции всегда следует рассматривать как один из трёх практических случаев: работа продолжается, нужно подождать или продолжить невозможно.
| Ситуация | Поведение приложения | Что нужно сохранить для разбора |
|---|---|---|
| Временная проблема связи | Сообщить о проблеме и разрешить повторить действие | Операцию, время и причину |
| Backend отклонил запрос | Объяснить, что пользователь может исправить | Ответ Backend без личных данных |
| SDK не запустился | Отключить только связанную возможность | Этап подключения и причину |
| Получены неполные данные | Показать доступную часть или остановить опасное действие | Какие сведения отсутствовали |
Записи для разбора не должны содержать пароли, личные сообщения или другие чувствительные сведения. Кроме того, секреты серверной системы нельзя помещать в мобильное приложение: установленную программу можно исследовать, поэтому спрятанная в ней строка не становится надёжно защищённой.
Практический порядок интеграции
Интеграцию лучше строить не от установки готового кода, а от пользовательского результата. Для экрана заказа работа может выглядеть так:
- Сформулировать результат. Пользователь видит актуальный статус заказа и, если возможно, его положение.
- Назначить владельца каждого решения. Backend определяет статус, SDK показывает карту, Flutter-интерфейс представляет результат.
- Зафиксировать контракт. Команды заранее согласуют обязательные данные, возможные ошибки и правила повторения.
- Собрать минимальный рабочий путь. Один реальный заказ проходит от запроса до отображения без дополнительных украшений.
- Добавить сценарии отказа. Отдельно проверяются отсутствие связи, неполные данные, запрет пользователя и недоступность внешнего сервиса.
- Добавить наблюдаемость. Команда должна понимать, на каком этапе возникла проблема, не воспроизводя её исключительно со слов пользователя.
- Проверить независимость частей. Сбой карты не должен уничтожать статус заказа, если тот уже получен.
На собеседовании полезно рассказывать об интеграции именно в такой логике. Фраза «я подключил SDK карты» описывает действие, но не показывает инженерного решения. Сильный рассказ объясняет цель, границы ответственности, варианты отказа, защиту данных и способ диагностики.
Когда интеграция действительно завершена
Перед выпуском функции команда должна получить ответы на несколько вопросов:
- Кто является источником истины для каждого показанного значения?
- Что увидит пользователь при частичном сбое?
- Можно ли безопасно повторить неудачную операцию?
- Не хранит ли приложение серверные секреты?
- Можно ли определить место сбоя по техническим записям?
- Продолжит ли основная функция работать без необязательного внешнего сервиса?
- Согласованы ли изменения с приложениями, которые уже установлены у пользователей?
Подробную организацию кода, управление состояниями, сетевые инструменты, уведомления, карты и синхронизацию мы разберём в следующих главах курса. Пока важна общая картина: Flutter-приложение не просто соединяет два готовых блока, а управляет границами между ними.
Возвращаясь к заказу № 4821: хороший экран не обещает, что сеть, Backend и карта никогда не ошибутся. Он сохраняет полезный результат, локализует сбой и сообщает пользователю, что можно сделать дальше. Именно предсказуемость, а не единичный успешный запуск, превращает подключение сервиса в полноценную интеграцию.