Как добавить заголовки ко всем запросам в OkHttp
AndroidHTTP запросыOkHttpRetrofitзаголовки
Что проверяют
Знаете ли вы про перехватчики и понимаете ли разницу между уровнями, на которых они работают.
Как отвечать
Заголовки добавляются перехватчиком, который применяется ко всем запросам клиента.
val client = OkHttpClient.Builder()
.addInterceptor { chain ->
val request = chain.request().newBuilder()
.header("X-App-Version", BuildConfig.VERSION_NAME)
.header("Accept-Language", Locale.getDefault().language)
.build()
chain.proceed(request)
}
.build()Важные детали:
- запрос неизменяемый, поэтому создаётся копия через
newBuilder.headerзаменяет значение,addHeaderдобавляет ещё одно; addInterceptorпротивaddNetworkInterceptor: первый работает на уровне приложения и видит запрос один раз, даже если случились перенаправления и повторы; второй работает ближе к сети и видит каждую попытку, включая служебные заголовки. Для авторизации и своих заголовков берут первый;- токен: если он меняется, значение берут из хранилища прямо внутри перехватчика, а не сохраняют при создании клиента;
- обновление токена делают не перехватчиком, а
Authenticator: он вызывается при ответе 401 и умеет повторить запрос с новым токеном, не создавая бесконечный цикл; - порядок перехватчиков имеет значение: журналирующий ставят последним, чтобы он видел уже добавленные заголовки;
- один клиент на приложение:
OkHttpClientтяжёлый, его переиспользуют, а варианты настроек получают черезnewBuilder.
Где спотыкаются
Создают новый клиент на каждый запрос и теряют пул соединений и кеш.
Обновляют токен внутри обычного перехватчика и получают гонку из параллельных обновлений.
Логируют заголовок авторизации целиком и утекают токен в систему сбора логов.