Что находится под капотом HTTP клиента в Android
Что проверяют
Представляете ли вы, что происходит между вызовом метода интерфейса и приходом ответа. Вопрос отсеивает тех, кто знает только аннотации Retrofit, от тех, кто чинил таймауты, повторы и утечки соединений.
Как отвечать
Сначала разделите слои: Retrofit сети не знает, он превращает интерфейс с аннотациями в вызовы и делегирует их клиенту, по умолчанию OkHttp. Старый HttpURLConnection в Android тоже реализован поверх OkHttp, а Apache-клиент из состава SDK давно удалён.
Дальше опишите путь запроса внутри клиента, он проходит цепочку перехватчиков:
- диспетчер с пулом потоков и лимитами на число одновременных вызовов, отдельно общим и на хост;
- слой повторов и переходов: редиректы, смена маршрута после неудачи;
- мостовой слой: дописывает служебные заголовки, просит сжатие и прозрачно распаковывает ответ;
- кэш: хранение ответов на диске по заголовкам, условные запросы и обработка ответа «не изменилось»;
- соединение: разрешение имени, установка сокета, рукопожатие TLS с согласованием протокола, пул постоянных соединений, а по HTTP/2 ещё и несколько запросов в одном соединении;
- отправка и чтение через буферы Okio, где тело ответа это поток.
Свои перехватчики делятся на прикладные, которые видят логический запрос один раз, и сетевые, срабатывающие на каждой попытке, включая редиректы и повторы. Обновление токена вешают на отдельный механизм аутентификатора, а не на перехватчик. Синхронный вызов на главном потоке запрещён, работают через очередь, корутины или реактивные обёртки.
Где спотыкаются
Пересказывают публичный интерфейс: запрос, ответ, колбэк. Спрашивали про устройство, то есть про пул соединений, рукопожатие, кэш и повторы, а про них и не сказано ни слова.
Второе: создают новый клиент на каждый запрос. Вместе с ним заново создаются пул соединений, кэш и пул потоков, поэтому каждое обращение снова платит за установку соединения и TLS. Клиент делают одним на приложение, а вариации получают через построитель на его основе.
Третье: не закрывают тело ответа или пробуют прочитать его дважды. Поток читается один раз, а незакрытое тело удерживает соединение, и под нагрузкой пул упирается в лимит там, где сеть ни при чём.