← Назад к вопросам

Что такое interceptor?

1.8 Middle🔥 181 комментариев
#Сетевое взаимодействие

Комментарии (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 операциями в приложении, критически важны для реальных проектов с авторизацией, логированием и обработкой ошибок.

Что такое interceptor? | PrepBro