Что такое interceptor

Ответ

Interceptor — это компонент, который позволяет перехватывать и обрабатывать HTTP-запросы и ответы перед их отправкой или после получения. Чаще всего используется в библиотеках типа OkHttp для логирования, добавления заголовков, обработки ошибок и т.д.

Пример с OkHttp:

val loggingInterceptor = HttpLoggingInterceptor().apply {
    level = HttpLoggingInterceptor.Level.BODY
}

val client = OkHttpClient.Builder()
    .addInterceptor(loggingInterceptor)
    .addInterceptor { chain ->
        val request = chain.request().newBuilder()
            .addHeader("Authorization", "Bearer token")
            .build()
        chain.proceed(request)
    }
    .build()

Виды интерцепторов:

  1. Application Interceptors — работают на уровне приложения.
  2. Network Interceptors — работают на сетевом уровне (после кеширования).

Ответ 18+ 🔞

Ну, слушай, смотри, чтобы ты понимал. Interceptor — это такая хитрая жопа, которая вклинивается между твоим запросом и всем миром. Представь: ты отправляешь письмо, а тут этот тип в пальто (интерцептор) хватает его, может дописать пару строк, или, наоборот, прочитать, что тебе пришло в ответ, прежде чем отдать. В общем, полный контроль, ёпта.

Чаще всего эту мудню используют с OkHttp, чтобы, например, логировать каждый чих или автоматом впендюривать заголовки типа авторизации. Без этого пришлось бы каждый раз вручную ебаться, а так — красота.

Вот, смотри, как это выглядит в коде, тут всё просто:

val loggingInterceptor = HttpLoggingInterceptor().apply {
    level = HttpLoggingInterceptor.Level.BODY
}

val client = OkHttpClient.Builder()
    .addInterceptor(loggingInterceptor)
    .addInterceptor { chain ->
        val request = chain.request().newBuilder()
            .addHeader("Authorization", "Bearer token")
            .build()
        chain.proceed(request)
    }
    .build()

Видишь? Первый — loggingInterceptor — это такой бздун, который будет выводить в лог всё, что летает туда-сюда, включая тело запроса. Уровень BODY — это овердохуища подробностей, будь осторожен с данными.

А второй — это уже наш кастомный перехватчик. Он берёт цепочку (chain), вытаскивает из неё запрос, лепит к нему заголовок с токеном и говорит: «А теперь, сука, продолжай (proceed)». И запрос полетел дальше уже с авторизацией. Удобно же, блядь!

А теперь про виды, их два основных, и тут важно не проебаться:

  1. Application Interceptors — это те, что работают на уровне приложения. Они срабатывают ДО того, как запрос вообще ушёл в сеть. Идеально для добавления глобальных заголовков или, например, чтобы взъебнуть какую-то свою логику преобразования запроса. Доверия к ним — ебать ноль, потому что они могут сработать даже если ответ уже лежит в кеше и сеть не нужна.

  2. Network Interceptors — вот эти уже построже. Они вступают в игру ПОСЛЕ кеширования, прямо на сетевом уровне. То есть если ответ был закеширован, их и не позовут. Зато они видят всё по-честному: настоящие заголовки, которые уже пошли по проводам, могут перехватить редиректы. Но и требования к ним выше — без подключения к интернету они просто не сработают.

Короче, выбирай с умом. Хочешь что-то сделать с запросом в любом случае — бери Application. Хочешь работать именно с сетевым трафиком — тогда Network, но помни, что кеш тебя обойдет. Вот и вся магия, ебать мои старые костыли.