Настройка OkHttp для сетевых запросов в Android-приложении
Представьте: приложение тормозит на 3G, ответы API приходят через 10 секунд, а трафик улетает впустую. Мы сталкивались с десятками таких проектов, где корень проблемы — в конфигурации OkHttp. Правильная настройка этого HTTP-клиента ускоряет запросы на 30–50% и сокращает объём передаваемых данных до 40%. 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 ускоряет повторные запросы на 30–50% и работает в оффлайне, если сервер отдаёт Cache-Control. Если не отдаёт – используем ForceCacheInterceptor с принудительным FORCE_CACHE. Для достижения максимальной производительности настройте таймауты под сценарии.
Почему стоит использовать один OkHttpClient для всех библиотек?
Coil принимает OkHttpClient в ImageLoader.Builder, Retrofit – в Retrofit.Builder. Один настроенный клиент с общим connection pool и кешем вместо нескольких – снижает расход памяти на 20% и упрощает мониторинг. Например, приложение с тремя 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+.
Как certificate pinning защищает от MITM и как его внедрить?
Certificate pinning привязывает приложение к конкретному сертификату сервера через SHA-256 fingerprint. Добавьте CertificatePinner:
val certificatePinner = CertificatePinner.Builder() .add("example.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") .build() Без pinning любой перехватчик с самоподписанным сертификатом может читать трафик. При ротации сертификата добавляйте новый fingerprint за месяц до замены. Для тестов используйте CERTIFICATE_PINNER в Debug-конфиге с ослабленной проверкой.
Тестирование: MockWebServer из com.squareup.okhttp3:mockwebserver поднимает локальный сервер и возвращает заготовленные ответы – standard для unit-тестов. Для интеграционных тестов используйте RecordingHostnameVerifier.
Что входит в работу по настройке OkHttp
- Аудит текущей сетевой подсистемы
- Конфигурация OkHttpClient: таймауты, кеш, пул соединений
- Интеграция перехватчиков (логирование, аутентификация, мониторинг)
- Настройка WebSocket с автоматическим реконнектом
- Certificate pinning для безопасных API
- Подготовка документации и код-ревью
- Тестирование с MockWebServer
- Поддержка после внедрения – 1 месяц
Сроки и стоимость
Настройка OkHttp с интерсепторами, кешем, WebSocket или загрузкой файлов занимает от 1 до 3 дней. Стоимость рассчитывается индивидуально – оценим ваш проект бесплатно после брифа. Закажите консультацию, и мы предложим оптимальную конфигурацию.
Для получения точной оценки свяжитесь с нами — мы проанализируем ваш проект и предложим конфигурацию, которая решит проблему медленных или нестабильных запросов уже на этапе прототипа.







