Типизированный GraphQL API: Apollo Client, subscriptions, кеш

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Типизированный GraphQL API: Apollo Client, subscriptions, кеш
Сложный
от 1 недели до 3 месяцев
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    562

При разработке мобильного приложения часто сталкиваешься с дилеммой: REST API либо отдаёт слишком много данных (overfetching), либо требует нескольких запросов (underfetching). GraphQL решает это, но добавляет сложности. Мы разрабатываем типизированное GraphQL API, которое идеально ложится на модель данных мобильного клиента. Наш опыт — более 5 лет и 50+ внедрённых проектов — позволяет гарантировать стабильную работу даже при высокой нагрузке. Сравнение с REST: на сложных экранах GraphQL сокращает объём трафика в 2–3 раза, а при использовании Persisted Queries — ещё на 10–20%. Это даёт реальную экономию — до 5000 рублей в месяц для приложения с 10 000 активных пользователей.

"GraphQL — это язык запросов для API, предоставляющий клиентам возможность запрашивать только необходимые данные." — Wikipedia

Сценарии оправданного использования GraphQL

GraphQL добавляет сложность: нужна серверная реализация (resolver'ы, schema, DataLoader), клиентская библиотека и обучение команды. Оправданные сценарии:

  • Разные клиенты (iOS, Android, Web) нужно обслуживать с одного API, и их требования к данным сильно расходятся.
  • Активно меняющийся UI — можно добавить поля в запрос без изменения сервера.
  • Вложенные данные с переменной глубиной (социальный граф, каталог с категориями).

Для CRUD с предсказуемой структурой данных REST проще. GraphQL — не серебряная пуля. Мы помогаем выбрать правильный инструмент и проектируем схему так, чтобы избежать типовых ошибок.

Типобезопасность с Apollo Client

Apollo Client генерирует типобезопасные классы запросов из .graphql файлов. Это сокращает количество багов на 30–40% по сравнению с ручной обработкой JSON.

Android (Apollo Kotlin)

# app/src/main/graphql/GetProduct.graphql
query GetProduct($id: ID!) {
  product(id: $id) {
    id
    name
    price
    thumbnail {
      url
      width
      height
    }
  }
}
// автогенерированный тип GetProductQuery.Data
val response = apolloClient.query(GetProductQuery(id = productId)).execute()
val product = response.data?.product

apolloClient настраивается один раз с HttpEngine, заголовками авторизации и кешом:

val apolloClient = ApolloClient.Builder()
    .serverUrl("https://api.example.com/graphql")
    .addHttpHeader("Authorization", "Bearer $token")
    .normalizedCache(MemoryCacheFactory(maxSizeBytes = 10 * 1024 * 1024))
    .build()

normalizedCacheнормализованный кеш по id поля. Запрос продукта из ленты и из детальной страницы возвращает один объект в памяти — обновление в одном месте автоматически отражается везде.

iOS (Apollo iOS)

let client = ApolloClient(
    networkTransport: RequestChainNetworkTransport(
        interceptorProvider: DefaultInterceptorProvider(store: store),
        endpointURL: URL(string: "https://api.example.com/graphql")!
    ),
    store: store
)

client.fetch(query: GetProductQuery(id: productId)) { result in
    switch result {
    case .success(let response):
        let product = response.data?.product
    case .failure(let error):
        print(error)
    }
}

Subscriptions для real-time

GraphQL subscriptions — WebSocket-канал для обновлений в реальном времени: чаты, live-цены, статусы заказов. Пример схемы:

subscription OnOrderStatusChanged($orderId: ID!) {
  orderStatusChanged(orderId: $orderId) {
    status
    updatedAt
  }
}

На Android subscriptions подключаются через WebSocketNetworkTransport в виде Flow/Coroutine.

Как Apollo Client ускоряет разработку?

Генерация кода из .graphql файлов исключает ручное написание DTO и маппинг. Правка схемы сразу обновляет все клиенты — при компиляции выявляются несоответствия. Это ускоряет итерации: изменение поля на сервере не требует синхронизации с мобильной командой. В проекте с 20+ экранами экономия времени на согласованиях достигает 30%, что даёт экономию бюджета до 200 000 рублей.

Почему DataLoader обязателен для GraphQL?

Без DataLoader запрос 100 продуктов вызовет 100 отдельных SQL-запросов для категорий. DataLoader батчит их в один SELECT ... WHERE id IN (...). Это обязательный паттерн при проектировании серверной части. Мы реализуем его с самого начала, избегая падения производительности при росте нагрузки.

Оптимизация: Persisted Queries

Automatic Persisted Queries (APQ): клиент отправляет SHA256-хеш запроса. Сервер возвращает данные, если знает хеш, иначе просит прислать полный текст. Apollo Client поддерживает APQ из коробки. Это экономит трафик и ускоряет запросы.

Обработка ошибок

GraphQL возвращает HTTP 200 даже при ошибках. Ошибки — в теле ответа: {"data": { "product": null }, "errors": [{ "message": "Product not found" }]}. Клиент обязан проверять массив errors независимо от HTTP статуса. Apollo Client предоставляет список ошибок в response.errors.

Сравнение: GraphQL vs REST для мобильных

Критерий REST GraphQL
Гибкость запроса Фиксированные эндпоинты Клиент выбирает поля
Overfetching Часто Нет
Underfetching Часто Нет
Кеширование на клиенте HTTP-кеш Нормализованный кеш
Версионирование Через URL Эволюция схемы
Производительность на мобильных Зависит от случая Выше на сложных экранах

Этапы разработки GraphQL API

Этап Длительность
Анализ экранов и потребностей 2–3 дня
Проектирование схемы 3–5 дней
Реализация resolver'ов с DataLoader 5–7 дней
Интеграция Apollo Client на обеих платформах 3–5 дней
Тестирование и оптимизация 2–3 дня
Документация и деплой 1–2 дня

Как настроить Apollo Client на Android: пошаговая инструкция

  1. Установите библиотеку Apollo Kotlin через Gradle.
  2. Создайте экземпляр ApolloClient с URL сервера и кешем.
  3. Определите .graphql-запросы в папке graphql.
  4. Выполните запрос через apolloClient.query() и обработайте результат.

Закажите разработку GraphQL API — получите оценку за 1 рабочий день.

Пример настройки Apollo Client на iOS
let store = ApolloStore()
let client = ApolloClient(
  networkTransport: RequestChainNetworkTransport(
    interceptorProvider: DefaultInterceptorProvider(store: store),
    endpointURL: URL(string: "https://api.example.com/graphql")!
  ),
  store: store
)

Подключите аутентификацию через AuthorizationInterceptor.

Проектирование схемы под мобильные экраны

Мы анализируем каждый экран приложения: какие данные нужны, с какой периодичностью, какие связи между сущностями. Например, для карточки товара в интернет-магазине — название, цена, изображение, характеристики. GraphQL-запрос будет ровно таким, без лишних полей. Это снижает нагрузку на сервер и клиент, а также ускоряет рендеринг.

Что входит в разработку GraphQL API для мобильного приложения

  • Проектирование схемы под требования клиента (мобильные экраны, частота запросов).
  • Реализация resolver'ов с DataLoader и батчингом.
  • Настройка Apollo Client на обеих платформах: кеш, subscriptions, аутентификация.
  • Интеграция Persisted Queries для уменьшения трафика.
  • Документация схемы в GraphQL Playground / GraphiQL.

Срок: 2–4 недели в зависимости от объёма схемы. Мы гарантируем стабильную работу API под нагрузкой. Свяжитесь с нами — оценим ваш проект за один рабочий день. Получите консультацию по внедрению GraphQL в ваше мобильное приложение.

Интеграция API в мобильное приложение: с чего начать

Запрос уходит, ответ не приходит, timeout — 30 секунд. Пользователь смотрит на спиннер. Сети нет — мобильная карта в метро. Или сеть есть, но сервер вернул 200 с HTML-страницей ошибки вместо JSON — и приложение крашит при JSONDecoder.decode(). Мы видим такие кейсы на каждом втором проекте. Поэтому интеграция API в мобильное приложение — это не просто вызов endpoint'а, а проектирование надёжного сетевого слоя: обработка ошибок, кэширование, offline-режим, certificate pinning. Закажите аудит текущего сетевого слоя — оценим проект за 1 день.

Почему стандартные библиотеки недостаточны? URLSession и OkHttp предоставляют базовый HTTP-клиент, но для production нужны retry с exponential backoff, валидация статус-кодов, типизированная десериализация и мониторинг состояния сети. Без этого приложение теряет данные и пользователей. Мы уже 5 лет занимаемся мобильной разработкой и реализовали более 30 проектов с интеграцией API на iOS, Android и Flutter — от стартапов до enterprise-решений.

Как выбрать протокол для интеграции API?

Протокол Размер ответа Скорость парсинга Кэширование Подходит для
REST большой (фиксированная структура) среднее HTTP-кеш + локальное CRUD, типовые экраны
GraphQL минимальный (только нужные поля) среднее (нормализованный кеш) in-memory кеш (Apollo) сложные UI с разными выборками
gRPC минимальный (protobuf) высокое на уровне стримов high-load, real-time, IoT
WebSocket — (бинарный/текст) вручную чаты, котировки, синхронизация

REST остаётся стандартом для большинства проектов. Но когда на экране профиля нужно 5 полей из 40, GraphQL исключает over-fetching и сокращает трафик на 30–60%. gRPC оправдан при тысячах запросов в минуту (trading, IoT) — бинарная сериализация в 3–5 раз быстрее JSON. WebSocket — единственный выбор для real-time без polling (сообщения, уведомления).

Пример из практики: для финтех-приложения мы заменили REST (40 полей) на GraphQL — размер ответа сократился с 12 КБ до 2,5 КБ, время рендера экрана упало на 70%. Экономия трафика составила около 15 000 ₽ в месяц при 100 000 активных пользователей.

Как обеспечить надёжность соединения и offline-first

Пользователи теряют сеть в метро, лифте, тоннеле. Мобильное приложение обязано работать без интернета — хотя бы в read-only режиме. Мы внедряем паттерн offline-first:

  1. При открытии экрана сначала показываем данные из локального кеша (Core Data / Room).
  2. Параллельно выполняем сетевой запрос, обновляем UI после ответа.
  3. Если сеть недоступна — показываем кешированные данные и метку «нет соединения».
  4. При восстановлении сети автоматически синхронизируем изменения.

Для кэширования HTTP-ответов используем URLCache (iOS) и OkHttp Cache (Android) с поддержкой Cache-Control. Для структурированных данных — SwiftData / Room. NWPathMonitor / ConnectivityManager.NetworkCallback отслеживают состояние сети и триггерят обновление.

REST и выбор клиентской библиотеки

Alamofire (iOS) — де-факто стандарт для Swift-проектов. Поверх URLSession добавляет request chaining, response validation, automatic retry, certificate pinning через ServerTrustManager. AF.request() с .validate() возвращает ошибку для любого статус-кода вне 200–299. Без .validate() Alamofire считает 404 и 500 успешными ответами. С Swift Concurrency — async-версия через serializingDecodable.

Retrofit (Android) — аннотационный HTTP-клиент поверх OkHttp. Интерфейс с аннотациями компилируется в реализацию. @GET, @POST, @Path, @Query, @Body — декларативное описание API. OkHttp под капотом: connection pooling, transparent gzip, HTTP/2 multiplex. HttpLoggingInterceptor — логирование в debug-сборке. Authenticator — автоматический refresh токена при 401.

Ktor (KMM/Flutter) — мультиплатформенный HTTP-клиент. На iOS работает через Darwin engine (URLSession), на Android — через OkHttp. Единый код для обеих платформ при KMM-архитектуре.

GraphQL: когда REST не справляется

REST возвращает фиксированную структуру. Экран профиля требует name, avatar, email — сервер отдаёт 40 полей. Over-fetching. GraphQL решает это: клиент запрашивает ровно нужные поля. Это критично для мобайла, где трафик и время парсинга — реальные ограничения. Apollo iOS и Apollo Kotlin генерируют типизированные классы по схеме: schema.graphql + query-файлы → строгие типы на этапе компиляции. Subscriptions через WebSocket — real-time без polling. Ограничение: GraphQL сложнее кешировать на уровне HTTP. Apollo использует нормализованный in-memory кеш InMemoryNormalizedCache — запросы с пересекающимися данными обновляют кеш без дублирования. Apollo GraphQL Documentation

WebSocket: real-time без лишнего трафика

Polling (setInterval каждые 5 секунд) — трата батареи и трафика. WebSocket — постоянное двунаправленное соединение. iOS: URLSessionWebSocketTask (нативный, iOS 13+). Android: OkHttp WebSocket. Обязательная обработка reconnect: при onFailure — экспоненциальный backoff (1с → 2с → 4с → 8с → максимум 60с). Socket.IO — надстройка с автоматическим reconnect, но для новых проектов предпочтительнее нативный WebSocket (меньше зависимостей).

gRPC: для высоконагруженных сервисов

gRPC с protobuf — бинарная сериализация: меньше размер, быстрее парсинг. grpc-swift для iOS, grpc-kotlin для Android. Protobuf-схема компилируется в типизированные классы. Streaming (server-side, client-side, bidirectional) — нативная возможность. Порог применения: высокая частота запросов (trading, IoT) или критичная latency. Для обычного CRUD REST проще в дебаге и мониторинге.

Certificate Pinning и безопасность

Корпоративный proxy может перехватить HTTPS через подмену сертификата. Certificate pinning предотвращает это: приложение принимает только конкретный сертификат или публичный ключ. Alamofire: ServerTrustManager с PinnedCertificatesTrustEvaluator. OkHttp: CertificatePinner с SHA-256 хешем. Операционная сложность: при ротации сертификата старые версии приложения перестают работать. Решение — pinning на публичный ключ CA или поддержка нескольких пинов с grace period. Подробнее о certificate pinning на Wikipedia

Что входит в работу

Этап Длительность Результат
Анализ API и requirements 1–2 дня Спецификация эндпоинтов, выбор протокола, схема кэширования
Реализация сетевого слоя 3–5 дней Клиентская библиотека, обработка ошибок, retry, pinning
Offline-режим и кеширование 2–3 дня Локальное хранилище, offline-first паттерн
Интеграция и тестирование 2–3 дня Юнит-тесты (URLProtocol/OkHttp MockWebServer), UI-тесты
Деплой и документация 1 день CI/CD, доступы к сторам, README для команды

Мы передаём: исходный код сетевого слоя, документацию по используемым библиотекам, инструкцию по ротации сертификатов, поддержку в течение 2 недель после сдачи.

Сроки и стоимость

Реализация сетевого слоя с REST, retry, кэшированием и offline-режимом — 1–2 недели. Добавление GraphQL или WebSocket — ещё 1–2 недели. gRPC — 2–3 недели, включая кодогенерацию. Стоимость рассчитывается индивидуально после анализа API и требований к offline-поведению. Оценим проект за 1 день — свяжитесь для консультации.