Налаштування 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, не hardcoded в коді. Різні оточення (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 дні. Вартість розраховується індивідуально.







