Добавление нескольких перехватчиков в OkHttpClient

3

Я пытаюсь понять и использовать перехватчики в приложении. Я использую LoggingInterceptor, а также включаю другой перехватчик для добавления заголовка авторизации. Я заметил, что при добавлении нескольких перехватчиков мне нужно вызвать chain.proceed(chain.request) который в основном выполняет запрос несколько раз и chain.proceed(chain.request) ответы на все добавленные мной перехватчики.

Это то, где я очень запутался, я не хочу, чтобы запрос выполнялся несколько раз из-за количества перехватчиков, которые у меня есть. Есть ли способ, которым я могу достичь этого?

Теги:
retrofit2
okhttp3

1 ответ

9
Лучший ответ

Я не уверен, что вы видите, чтобы сделать вывод, что вы выполняете запрос несколько раз, но я могу заверить вас, что это не так.

OkHttp работают как цепочка, отсюда и chain имен для класса, который вы получаете в методе перехватчика. Перехватчики запускаются в порядке сложения для запросов и в обратном порядке сложения для ответов. Например, если вы добавите сначала перехватчик журналирования, а затем аутентификацию, вы будете сначала запускать регистратор для запросов, а затем аутентификацию. Это означает, что вы не увидите заголовки аутентификации запроса (или любого другого поля аутентификации), потому что они добавляются после того, как вы зарегистрировали запрос.

Напротив, если вы добавите перехватчик регистрации в конце, вы увидите все, что было добавлено предыдущими перехватчиками.

Давайте рассмотрим общий пример: A->B->C - это цепочка перехватчиков, которая была добавлена в алфавитном порядке. Это означает, что сначала выполняется A, затем B а затем C для запросов и ответов, сначала C, затем B а затем A Когда A выполнит запрос, он может вызвать chain.proceed и выполнить запрос к B То же самое для B когда он хочет "обработать" запрос в цепочке. Как только все перехватчики сделаны, OkHttp выполнит запрос один раз и выполнит ответ через все перехватчики в обратном порядке. Другими словами, именно здесь возникает концепция цепочки. Она почти как композиция функций в функциональном программировании.

В конце концов, вы не запускаете запрос несколько раз, если вы вызываете chain.proceed(chain.request), вы просто передаете его по цепочке и ожидаете ответа.

Вот официальное объяснение, которое будет намного лучше моего.

  • 0
    В основном то, что он сказал ^: D
  • 1
    Если бы не этот ответ, я бы не понял, что перехватчики работают таким образом, и это нигде не указано в документации (кроме изображения на ссылочной вики-странице). Большое спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню