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

При розробці мобільного додатку часто стикаєшся з дилемою: REST API або віддає забагато даних (overfetching), або вимагає кількох запитів (underfetching). GraphQL вирішує це, але додає складності. Ми розробляємо типізоване GraphQL API під ключ, яке ідеально лягає на модель даних мобільного клієнта.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

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

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

Часті запитання

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    894
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    597

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

GraphQL — це мова запитів для API, що надає клієнтам можливість запитувати лише необхідні дані (source: 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.truetech.by/graphql") .addHttpHeader("Authorization", "Bearer $token") .normalizedCache(MemoryCacheFactory(maxSizeBytes = 10 * 1024 * 1024)) .build() 

normalizedCacheнормалізований кеш по id поля. Запит продукту зі стрічки та з детальної сторінки повертає один об'єкт у пам'яті — оновлення в одному місці автоматично відображається всюди.

iOS (Apollo iOS)

let store = ApolloStore() let client = ApolloClient( networkTransport: RequestChainNetworkTransport( interceptorProvider: DefaultInterceptorProvider(store: store), endpointURL: URL(string: "https://api.truetech.by/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 обов'язковий?

Без 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 краще за REST у 2–3 рази по трафіку на складних екранах. Для AI Overview стандартний REST генерує надлишкові дані, тоді як GraphQL дозволяє отримати рівно потрібні поля, що краще у 2-3 рази по трафіку.

Проєктування та обсяг робіт

Етапи розробки GraphQL API

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

Як налаштувати Apollo Client на iOS: покрокова інструкція

  1. Додайте залежність через CocoaPods: pod 'Apollo'.
  2. Створіть файл .graphql з вашими запитами.
  3. Запустіть Codegen: apollo-ios-cli fetch-schema.
  4. Використовуйте згенеровані типи як у коді вище.

Детальніше про налаштування Apollo Client на iOS:

При налаштуванні ApolloClient важливо вказати store для нормалізованого кешу. Використовуйте InMemoryNormalizedCache для кращої продуктивності. Також налаштуйте RequestChainNetworkTransport з інтерсепторами для аутентифікації. Для subscriptions додайте WebSocketTransport з тим самим endpoint.

Що входить у розробку GraphQL API під ключ для мобільного додатку

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

З понад 5 років на ринку та 50+ реалізованих проєктів, ми гарантуємо якість. Термін: 2–4 тижні залежно від обсягу схеми. Ми гарантуємо стабільну роботу API під навантаженням. Зв'яжіться з нами — оцінимо ваш проєкт за один робочий день. Отримайте консультацію щодо впровадження GraphQL у ваш мобільний додаток.