Настройка Retrofit для сетевых запросов в Android-приложении
Retrofit — де-факто стандарт для работы с REST API в Android. Библиотека превращает HTTP-вызовы в Kotlin suspend-функции или RxJava Observable, берёт на себя сериализацию/десериализацию, и при правильной настройке требует нулевого бойлерплейта для стандартных CRUD-операций.
Что включает настройка
Стандартный стек: Retrofit 2 + OkHttp как HTTP-клиент + kotlinx.serialization или Gson как конвертер. KotlinX Serialization предпочтительнее для Kotlin-проектов: null-safety на уровне JSON-парсинга, поддержка sealed классов, работа без рефлексии (важно для R8-обфускации).
Конфигурация Retrofit:
val retrofit = Retrofit.Builder()
.baseUrl(BuildConfig.API_BASE_URL)
.client(okHttpClient)
.addConverterFactory(Json.asConverterFactory("application/json".toMediaType()))
.build()
API_BASE_URL — из BuildConfig, не хардкодом в коде. Разные окружения (dev/staging/prod) управляются через productFlavors в Gradle.
Интерфейс API с suspend-функциями:
interface UserApi {
@GET("users/{id}")
suspend fun getUser(@Path("id") id: Long): UserResponse
@POST("users")
suspend fun createUser(@Body request: CreateUserRequest): UserResponse
@PUT("users/{id}")
@Headers("Content-Type: application/json")
suspend fun updateUser(@Path("id") id: Long, @Body request: UpdateUserRequest): UserResponse
}
Интерсепторы OkHttp
Здесь концентрируется большая часть логики сетевого слоя.
Авторизация: Interceptor, который добавляет Authorization: Bearer {token} к каждому запросу. Токен читается из зашифрованного EncryptedSharedPreferences или DataStore. Если токен протух — 401 от сервера, интерсептор через Authenticator (отдельный интерфейс OkHttp) делает refresh и повторяет запрос. Без Authenticator придётся обрабатывать 401 в каждом UseCase вручную.
Логирование: HttpLoggingInterceptor с BODY level — только в debug-сборке (if (BuildConfig.DEBUG)). В release — NONE. Логировать токены в production — уязвимость.
Retry: кастомный Interceptor с экспоненциальной задержкой для сетевых ошибок (IOException). Серверные ошибки (4xx, 5xx) — не повторяем автоматически, только сетевые.
Timeout: connectTimeout(30, TimeUnit.SECONDS), readTimeout(30, TimeUnit.SECONDS), writeTimeout(30, TimeUnit.SECONDS) на OkHttpClient.Builder. Для файловых загрузок — отдельный клиент с увеличенным writeTimeout.
Обработка ошибок
Suspend-функции Retrofit бросают HttpException при не-2xx статусе и IOException при сетевой ошибке. Оборачиваем в sealed-класс результата:
sealed class ApiResult<out T> {
data class Success<T>(val data: T) : ApiResult<T>()
data class Error(val code: Int, val message: String) : ApiResult<Nothing>()
data object NetworkError : ApiResult<Nothing>()
}
Это позволяет ViewModel работать с типизированными ошибками без try/catch на каждом вызове — логика обёртки в одном месте в NetworkDataSource.
Certificate pinning через CertificatePinner в OkHttpClient — для приложений с повышенными требованиями безопасности (финтех, медицина). Требует обновления при ротации сертификата — этот процесс нужно планировать.
Настройка Retrofit с полным сетевым слоем (авторизация, retry, обработка ошибок, логирование, unit-тесты с MockWebServer) — 1-3 дня. Стоимость рассчитывается индивидуально.







