Добавление заголовка ко всем запросам Retrofit 2 и OkHttp
Быстрый ответ
Для автоматического добавления заголовков ко всем запросам в Retrofit 2 применяются перехватчики (interceptors). Необходимо реализовать интерфейс Interceptor
и применить его в OkHttpClient
:
public class UniversalHeaderInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request modifiedRequest = chain.request().newBuilder()
.addHeader("Header-Name", "Value")
.build();
return chain.proceed(modifiedRequest);
}
}
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new UniversalHeaderInterceptor())
.build();
Инициализируйте экземпляр Retrofit с настроенным клиентом, чтобы каждый запрос содержал требуемые заголовки.
Работа с заголовками с помощью Retrofit 2
Retrofit 2 значительно упрощает работу с заголовками при использовании перехватчиков OkHttp. Данный инструмент передает сетевые операции на уровень OkHttp, позволяя легко формировать запросы.
Применение перехватчиков
Перехватчики эффективно справляются с такими задачами, как:
- Аутентификация: контроль над передачей OAuth-токенов с помощью заголовков.
- Выбор формата данных: указание формата получаемых данных с помощью заголовка
Accept
.
Возможности перехватчиков
Метод intercept()
из Interceptor
многофункционален и может использоваться для решения множества задач:
- Общие параметры: автоматическое добавление API-ключей или информации сессии в каждый запрос.
- Повторение неудачных запросов: внедрение логики автоматического повтора.
- Логирование: отслеживание нужной информации для последующей отладки.
Визуализация
Можно сравнить Retrofit 2 с массивом (🟧), в котором каждый запрос – это элемент (⬜):
До добавления заголовков: 🟧
Последовательность запросов: [⬜, ⬜, ⬜]
Добавляя заголовки, представьте, что вы присваиваете идентификатор (⚫) каждому элементу:
Процесс: 🟧 + ⚫ ➡️ Каждому элементу массива присваивается идентификатор (Заголовок)
С добавленным заголовком каждый запрос получает уникальный идентификатор:
После:
Массив запросов: [⚫⬜, ⚫⬜, ⚫⬜] // Все запросы снабжены заголовками
Таким образом, благодаря общему массиву заголовков, каждый запрос можно точно идентифицировать.
Подготовка заголовков при необходимости
В условиях изменяемости запросы могут требовать различных заголовков. Retrofit 2 упрощает процесс их добавления через аннотации @Header
и @Headers
:
- @Header: динамическое добавление заголовков через параметры метода.
- @Headers: добавление статических заголовков к запросам,указанных перед объявлением метода.
Неотъемлемые инструменты
К таким составляющим, как GsonConverterFactory для работы с JSON и метод .baseUrl()
для указания основного URL API, добавьте HttpLoggingInterceptor для детального логирования. Однако, используйте логирование осторожно, ограничив его билдами разработки.
Перехватчики: Обычный Джо или Шерлок Холмс?
OkHttpClient
различает два типа перехватчиков: Application Interceptors (Обычный Джо) и Network Interceptors (Шерлок Холмс):
- Джо: проверяет каждый запрос и ответ, не занимаясь кэшированием данных.
- Шерлок: активируется только если ответ получен напрямую из сети, что делает его идеальным для мониторинга и логирования.
Полезные материалы
- Использование Retrofit 2.x как REST клиента – Учебник — Практическое руководство по работе с Retrofit.
- Использование OkHttp | CodePath Android Cliffnotes — Руководство по использованию перехватчиков OkHttp.
- Retrofit 2 — Управление сетевыми таймаутами — Инструкция по настройке таймаутов в Retrofit.
- Задержите минуту... – Добавление пользовательских заголовков запросов в Retrofit 2.
- Статья на Medium о аутентификации в Retrofit – Различные стратегии аутентификации с помощью Retrofit.