Ответ
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()
Виды интерцепторов:
- Application Interceptors — работают на уровне приложения.
- 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)». И запрос полетел дальше уже с авторизацией. Удобно же, блядь!
А теперь про виды, их два основных, и тут важно не проебаться:
-
Application Interceptors — это те, что работают на уровне приложения. Они срабатывают ДО того, как запрос вообще ушёл в сеть. Идеально для добавления глобальных заголовков или, например, чтобы взъебнуть какую-то свою логику преобразования запроса. Доверия к ним — ебать ноль, потому что они могут сработать даже если ответ уже лежит в кеше и сеть не нужна.
-
Network Interceptors — вот эти уже построже. Они вступают в игру ПОСЛЕ кеширования, прямо на сетевом уровне. То есть если ответ был закеширован, их и не позовут. Зато они видят всё по-честному: настоящие заголовки, которые уже пошли по проводам, могут перехватить редиректы. Но и требования к ним выше — без подключения к интернету они просто не сработают.
Короче, выбирай с умом. Хочешь что-то сделать с запросом в любом случае — бери Application. Хочешь работать именно с сетевым трафиком — тогда Network, но помни, что кеш тебя обойдет. Вот и вся магия, ебать мои старые костыли.