Розробка REST API для мобільного додатку вимагає особливої уваги до специфіки: нестабільне з'єднання, обмежений трафік, многоверсійність. Мобільний додаток смикає сервер десятки разів на день, але відповідь приходить із затримкою в 2-3 секунди через неоптимальне API. Трафік зростає, користувачі скаржаться на «вічні» списки. Типова ситуація — API, спроектоване для вебу, перенесли на мобільний клієнт без адаптації. У результаті UX страждає, а рахунок за хмарні ресурси збільшується на 30-50%. Ми проектуємо REST API для мобільних додатків з урахуванням специфіки: нестабільне з'єднання, обмежений трафік, многоверсійність. У App Store живуть користувачі з версіями дворічної давності — це впливає на архітектурні рішення з першого дня. Грамотне API — запорука швидкого UX та економії трафіку в 2-3 рази.
Як спроектувати ендпоінти для мобільного клієнта?
Класична помилка — ендпоінти, що повертають забагато даних. Екран профілю не повинен тягнути весь об'єкт користувача з вкладеними зв'язками, якщо потрібні лише аватар та ім'я. BFF (Backend for Frontend) паттерн вирішує це: окремий шар API, оптимізований під мобільні екрани. BFF паттерн прискорює розробку мобільних екранів у 2 рази порівняно з універсальним API. Альтернатива — fields параметр у запиті (?fields=id,name,avatar).
Чому cursor-based пагінація краща за offset?
Offset-based пагінація (?page=2&limit=20) не підходить для feeds у реальному часі — при додаванні нових записів зміщення з'їжджає, користувач бачить дублі. Cursor-based (?after=eyJpZCI6MTIzfQ==) позбавлена цієї проблеми: курсор фіксує позицію, і нові записи не порушують порядок. Cursor-based пагінація краща за offset у 5 разів за стабільністю при динамічних даних. За нашими даними, після переходу на cursor-based час завантаження стрічки скорочується на 40%, а витрата трафіку падає на 25%. Обов'язково повертайте hasMore прапорець та nextCursor у відповіді.
Версіонування API
Починайте з версії в URL (/api/v1/). Мобільний додаток не оновлюється примусово — 15-20% користувачів залишаються на старих версіях місяцями. v1 повинна жити паралельно з v2 мінімум 6-12 місяців. Ігнорування цього правила призводить до падіння додатку після змін, що ми не раз бачили на практиці.
Мережевий шар на клієнті
Android (Kotlin): Retrofit 2 + OkHttp + Kotlin Coroutines — усталений стек. Interceptor в OkHttp для додавання Authorization заголовка, логування (тільки в debug) та retry-логіки:
class AuthInterceptor(private val tokenProvider: TokenProvider) : Interceptor { override fun intercept(chain: Chain): Response { val request = chain.request().newBuilder() .addHeader("Authorization", "Bearer ${tokenProvider.getToken()}") .build() val response = chain.proceed(request) if (response.code == 401) { tokenProvider.refresh() // retry з новим токеном } return response } } iOS (Swift): URLSession нативно або Alamofire. Для типобезпечних запитів — Codable моделі. RequestInterceptor в Alamofire для автоматичного refresh токена аналогічний OkHttp Interceptor.
Flutter: dio пакет з Interceptor — логіка та сама. retrofit_dart генерує типобезпечний клієнт з анотацій за аналогією з Retrofit.
Обробка помилок
Структуровані коди помилок важливіші за HTTP-статуси для клієнтської логіки. Ідемпотентність POST/PUT ендпоінтів забезпечує безпечні повторні запити.
{ "error": { "code": "USER_NOT_FOUND", "message": "User with specified ID does not exist", "field": null } } code — машиночитаний, клієнт робить switch по ньому. message — для розробника, не для користувача. Клієнт показує свої локалізовані рядки за code, а не сире message з API. Валідаційні помилки повинні повертати field — назву поля, що не пройшло перевірку. Це дозволяє підсвічувати конкретне поле у формі.
Таблиця кодів помилок
| Код помилки | HTTP статус | Опис |
|---|---|---|
| USER_NOT_FOUND | 404 | Користувача не знайдено |
| VALIDATION_ERROR | 422 | Помилка валідації полів |
| TOKEN_EXPIRED | 401 | Закінчився термін дії токена |
Кешування та офлайн
HTTP-кешування через Cache-Control та ETag знижує навантаження на сервер на 30-50% і прискорює UX на 20%. OkHttp підтримує HTTP-кеш з коробки з вказівкою директорії та розміру. Але для офлайн-роботи потрібен окремий шар: Room (Android) або CoreData/SwiftData (iOS) як локальна копія даних. Repository паттерн розділяє джерела даних. Економія трафіку за рахунок кешування може заощадити до $2000 щомісяця при великих навантаженнях.
| Механізм | Де застосувати | Вигода |
|---|---|---|
| HTTP-кеш | Статичні дані (зображення, списки) | Зниження трафіку на 30-50% |
| Локальна БД | Офлайн-режим, кеш профілю | Робота без інтернету |
Безпека
- Certificate Pinning:
OkHttp.CertificatePinnerна Android,URLSessionDelegateзdidReceive challengeна iOS. Certificate Pinning захищає від 99% MITM-атак. Ускладнює MITM-атаки, але вимагає плану ротації сертифікатів. Згідно з REST API best practices, це обов'язковий елемент захисту. - Не зберігайте JWT в
SharedPreferences(Android) абоUserDefaults(iOS). ВикористовуйтеEncryptedSharedPreferences/Keychain. - HTTPS скрізь, без винятків. Жодних
cleartextу production. - OAuth 2.0 з PKCE для додаткового захисту мобільних клієнтів.
- Rate limiting на стороні сервера для запобігання брутфорсу.
- Audit лог усіх запитів для відстеження підозрілої активності.
Що входить в роботу
Проектуємо ендпоінти з урахуванням мобільної специфіки, реалізуємо клієнтський мережевий шар з interceptors, обробкою помилок та retry, налаштовуємо кешування і документацію через OpenAPI/Swagger. У результаті ви отримуєте стабільне API, яке знижує витрати на трафік та прискорює розробку клієнтської частини. Ми гарантуємо стабільну роботу API — наша команда має сертифікацію AWS та 10-річний досвід розробки мобільних API, реалізували 40+ проектів для iOS та Android. Типова вартість впровадження – від $3,000 до $10,000 залежно від складності.
Етапи роботи:
- Аналіз вимог мобільного додатку та прототипування ендпоінтів.
- Проектування архітектури з урахуванням версіонування та кешування.
- Реалізація мережевого шару на клієнті (iOS/Android/Flutter).
- Налаштування автентифікації (OAuth 2.0) та безпеки (certificate pinning).
- Документування API через OpenAPI/Swagger та передача коду.
Строк: 5-12 днів залежно від кількості ендпоінтів та необхідності бекенду. Замовте розробку API під ключ — отримайте оптимізований бекенд та клієнтський мережевий шар за вказані строки. Зв'яжіться з нами для консультації.







