Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое interceptor?
Interceptor — это перехватчик сетевых запросов в OkHttp (основе Retrofit), позволяющий перехватывать, модифицировать и логировать HTTP запросы и ответы на различных уровнях.
Два типа интерцепторов
1. Application Interceptors (уровень приложения)
- Работают выше логики Retrofit
- Не видят автоматические редиректы, повторы
- Используются для логирования, добавления общих заголовков
2. Network Interceptors (уровень сети)
- Работают на уровне сетевых операций
- Видят полный цикл запроса (включая редиректы, редаи, кэширование)
- Более мощные и детальные
Практический пример: добавление авторизации
class AuthInterceptor(private val tokenManager: TokenManager) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val originalRequest = chain.request()
val token = tokenManager.getToken()
// Добавляем заголовок авторизации
val newRequest = originalRequest.newBuilder()
.header("Authorization", "Bearer $token")
.build()
return chain.proceed(newRequest)
}
}
// Регистрация в OkHttp клиенте
val httpClient = OkHttpClient.Builder()
.addInterceptor(AuthInterceptor(tokenManager))
.build()
val retrofit = Retrofit.Builder()
.client(httpClient)
.baseUrl("https://api.example.com")
.addConverterFactory(GsonConverterFactory.create())
.build()
Логирование запросов и ответов
class LoggingInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val startTime = System.currentTimeMillis()
// Логируем запрос
Log.d("HTTP", "→ Запрос: ${request.method} ${request.url}")
request.headers.forEach { (name, value) ->
Log.d("HTTP", " $name: $value")
}
val response = try {
chain.proceed(request)
} catch (e: IOException) {
Log.e("HTTP", "✗ Ошибка сети: ${e.message}")
throw e
}
val duration = System.currentTimeMillis() - startTime
// Логируем ответ
Log.d("HTTP", "← Ответ: ${response.code} (${duration}ms)")
response.headers.forEach { (name, value) ->
Log.d("HTTP", " $name: $value")
}
return response
}
}
Обработка ошибок и retry логика
class RetryInterceptor(private val maxRetry: Int = 3) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
var attempt = 0
var request = chain.request()
while (true) {
return try {
chain.proceed(request)
} catch (e: IOException) {
attempt++
if (attempt >= maxRetry) {
throw e
}
Log.w("Retry", "Попытка $attempt/$maxRetry после ошибки: ${e.message}")
// Повторяем запрос
continue
}
}
}
}
Типичные use-case интерцепторов
- Авторизация — добавление токенов, OAuth
- Логирование — отладка сетевых операций
- Кэширование — сохранение и переиспользование ответов
- Обработка ошибок — retry, fallback
- Трансформация запросов — добавление заголовков, параметров
- Мониторинг — сбор метрик производительности
- Тестирование — подмена реальных запросов mock-ответами
Порядок выполнения интерцепторов
Запрос: App → LoggingInterceptor → AuthInterceptor → Network → OkHttp → Сервер
Ответ: Сервер → OkHttp → Network → AuthInterceptor → LoggingInterceptor → App
Интерцепторы — это мощный инструмент для контроля над всеми HTTP операциями в приложении, критически важны для реальных проектов с авторизацией, логированием и обработкой ошибок.