При розробці мобільного додатку часто стикаєшся з дилемою: 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: покрокова інструкція
- Додайте залежність через CocoaPods:
pod 'Apollo'. - Створіть файл
.graphqlз вашими запитами. - Запустіть Codegen:
apollo-ios-cli fetch-schema. - Використовуйте згенеровані типи як у коді вище.
Детальніше про налаштування 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 у ваш мобільний додаток.







