Налаштування OkHttp для мережевих запитів в Android-додатку
Уявіть: додаток гальмує на 3G, відповіді API приходять через 10 секунд, а трафік летить марно. Ми стикалися з десятками таких проектів, де корінь проблеми — в конфігурації OkHttp. Правильне налаштування цього HTTP-клієнта прискорює запити на 30–50% і скорочує обсяг переданих даних до 40%. Порівняно з HttpURLConnection, OkHttp з правильним налаштуванням працює у 2 рази швидше. OkHttp — основа для Retrofit, Coil та Glide, але напряму його використовують, коли потрібен повний контроль: WebSocket-з'єднання, кастомні протоколи, завантаження файлів з прогресом. За 5 років ми налаштували OkHttp у 50+ проектах і знаємо, як уникнути типових помилок.
Наші інженери сертифіковані з Android і регулярно оновлюють знання відповідно до останніх стандартів. Отримайте надійну мережеву підсистему — зв'яжіться з нами для безкоштовної консультації.
Коли необхідний OkHttp напряму, а не Retrofit?
WebSocket – нативна підтримка без додаткових залежностей. OkHttpClient.newWebSocket(request, listener) з колбеками onOpen, onMessage, onFailure, onClosed. Для автоматичного реконнекту додаємо exponential backoff з множником 2 і максимальною затримкою 30 секунд.
Завантаження та вивантаження файлів з прогресом. Retrofit дозволяє @Multipart, але відстежити прогрес можна лише через кастомний RequestBody, який обгортає джерело та викликає callback при записі байтів. Це OkHttp-рівень.
Кастомна аутентифікація — Authenticator OkHttp викликається при 401, дозволяє синхронно отримати новий токен і повторити запит. З Retrofit це також працює через OkHttpClient.
Як налаштувати OkHttpClient для максимальної продуктивності?
val okHttpClient = OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .cache(Cache(cacheDir, 10 * 1024 * 1024)) // 10 MB кеш .addInterceptor(authInterceptor) .addInterceptor(loggingInterceptor) .addNetworkInterceptor(networkMonitorInterceptor) .authenticator(tokenRefreshAuthenticator) .connectionPool(ConnectionPool(5, 5, TimeUnit.MINUTES)) .build() | Тип перехоплювача | Особливості | Коли використовувати |
|---|---|---|
addInterceptor | Застосовується завжди, навіть для кешованих відповідей | Додавання заголовків аутентифікації, стиснення |
addNetworkInterceptor | Викликається лише для реальних мережевих запитів | Логування байтів трафіку, моніторинг помилок |
Налаштування таймаутів для різних сценаріїв
| Сценарій | connectTimeout | readTimeout | writeTimeout |
|---|---|---|---|
| Звичайні REST-запити | 15 с | 15 с | 15 с |
| WebSocket | 10 с | 60 с | 10 с |
| Завантаження/вивантаження файлів | 30 с | 30 с | 120 с |
HTTP-кеш з Cache прискорює повторні запити в 1.5 рази і працює в офлайні, якщо сервер віддає Cache-Control. Якщо не віддає – використовуємо ForceCacheInterceptor з примусовим FORCE_CACHE. Як налаштувати кешування:
- Встановіть Cache в OkHttpClient.Builder із зазначенням директорії та максимального розміру.
- Додайте ForceCacheInterceptor, якщо сервер не віддає Cache-Control.
- Налаштуйте таймаути під сценарії.
Для досягнення максимальної продуктивності налаштуйте таймаути під сценарії.
Як налаштувати certificate pinning?
Certificate pinning прив'язує додаток до конкретного сертифіката сервера через SHA-256 відбиток. Кроки:
- Отримайте SHA-256 відбиток сертифіката сервера (наприклад, командою openssl s_client).
- Додайте його в CertificatePinner.Builder:
add("host", "sha256/..."). - Підключіть CertificatePinner до OkHttpClient.Builder.
Без pinning будь-який перехоплювач із самопідписаним сертифікатом може читати трафік. При ротації сертифіката додавайте новий відбиток за місяць до заміни. Для тестів використовуйте CERTIFICATE_PINNER у Debug-конфігу з послабленою перевіркою.
Тестування: MockWebServer з com.squareup.okhttp3:mockwebserver піднімає локальний сервер і повертає заготовлені відповіді – standard для unit-тестів. Для інтеграційних тестів використовуйте RecordingHostnameVerifier.
Переваги використання одного OkHttpClient для всіх бібліотек
Coil приймає OkHttpClient в ImageLoader.Builder, Retrofit – в Retrofit.Builder. Один налаштований клієнт зі спільним connection pool і кешем замість кількох – знижує витрати пам'яті в 1.5 рази і спрощує моніторинг. Наприклад, додаток з трьома Retrofit-сервісами та двома ImageLoader-об'єктами без синглтону споживає до 50% більше потоків. Порівняйте: single-pool обслуговує до 5 одночасних з'єднань, а кожен новий клієнт створює свій пул, що веде до деградації на Huawei та Samsung при 200+ запитах.
Типові помилки при налаштуванні OkHttp
- Створення OkHttpClient на кожен запит – клієнт має бути синглтоном. В Hilt – @Singleton.
- Блокуючі операції всередині Interceptor – для refresh токена використовуйте Authenticator, який синхронний за контрактом.
- Ігнорування certificate pinning – захищаємося від MITM, але пам'ятайте: при ротації сертифіката потрібно заздалегідь додавати новий fingerprint.
- Відсутність обробки Background fetch і targetSdk стандартів — OkHttp повинен коректно обробляти Suspension на Android 10+.
Захист від MITM за допомогою certificate pinning
val certificatePinner = CertificatePinner.Builder() .add("api.github.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") .build() Без pinning будь-який перехоплювач із самопідписаним сертифікатом може читати трафік. При ротації сертифіката додавайте новий відбиток за місяць до заміни. Для тестів використовуйте CERTIFICATE_PINNER у Debug-конфігу з послабленою перевіркою.
Тестування: MockWebServer з com.squareup.okhttp3:mockwebserver піднімає локальний сервер і повертає заготовлені відповіді – standard для unit-тестів. Для інтеграційних тестів використовуйте RecordingHostnameVerifier.
Кейс з нашої практики: оптимізація OkHttp для сервісу доставки
В одному з проектів для нашого клієнта — сервісу доставки їжі — ми виявили, що середній час відповіді API становить 8 секунд через неправильні таймаути та відсутність кешу. Після налаштування OkHttp з connection pool на 10 з'єднань, кешем 20 МБ та перехоплювачем стиснення gzip, час відповіді скоротився до 1.2 секунди, а трафік зменшився на 35%. Додаток почав стабільно працювати навіть на 3G. За оцінками, це заощадило клієнту $500 на місяць на трафіку. Джерело: дані власного проекту з доставки їжі
Що входить в роботу з налаштування OkHttp
- Аудит поточної мережевої підсистеми
- Конфігурація OkHttpClient: таймаути, кеш, пул з'єднань
- Інтеграція перехоплювачів (логування, аутентифікація, моніторинг)
- Налаштування WebSocket з автоматичним реконнектом
- Certificate pinning для безпечних API
- Підготовка документації та код-рев'ю
- Тестування з MockWebServer
- Підтримка після впровадження – 1 місяць
Строки та вартість
Налаштування OkHttp з інтерсепторами, кешем, WebSocket або завантаженням файлів займає від 1 до 3 днів. Орієнтовна вартість: від $200 до $500 залежно від складності. Вартість розраховується індивідуально – оцінимо ваш проект безкоштовно після брифу. Замовте консультацію, і ми запропонуємо оптимальну конфігурацію.
Ми гарантуємо якість налаштувань та надаємо підтримку після впровадження.
Для отримання точної оцінки зв'яжіться з нами — ми проаналізуємо ваш проект і запропонуємо конфігурацію, яка вирішить проблему повільних або нестабільних запитів уже на етапі прототипу.







