Как устроено сетевое общение с использованием Retrofit
Что проверяют
Понимаете ли вы, что Retrofit это тонкая обёртка над OkHttp, а не сетевой стек сам по себе. Интервьюер смотрит, знаете ли вы, где заканчивается генерация запроса по аннотациям и начинается работа клиента: пул соединений, интерсепторы, таймауты, кэш. Следом почти всегда спрашивают про обработку ошибок и про то, где вы обновляете протухший токен.
Как отвечать
Разложите путь запроса:
- интерфейс: методы с аннотациями
@GET,@POST,@Path,@Query,@Body,@Header. Retrofit создаёт динамический прокси, разбирает аннотации при первом вызове и кэширует разбор; - сборка:
Retrofit.Builder()сbaseUrl(обязательно со слэшем на конце), конвертером (kotlinx-serializationсегодня стандарт, Moshi встречается, Gson в новых проектах не берут) и своимOkHttpClient; - OkHttp: таймауты
connect,readиwrite,HttpLoggingInterceptorтолько в debug-сборке,Interceptorдля заголовков,Authenticatorдля обновления токена по 401; - вызов:
suspend-функции поддерживаются с версии 2.6.0. ВозвратResponse<T>даёт доступ кcode(),headers()иerrorBody(), а голый тип бросаетHttpExceptionна не-2xx иIOExceptionна сетевом сбое.
Про версии: 2.9.0 из туториалов давно не актуальна, живые ветки это 2.11 и 3.x.
Про ошибки: разделяйте транспортный сбой (IOException, повторить осмысленно) и ответ сервера с кодом (повторять бессмысленно). Тело ошибки читается один раз: errorBody() это поток, второй string() вернёт пустоту.
Закончите практикой: отмена вместе с корутинной областью, ретраи с задержкой на своём уровне (в Retrofit их нет), кэш через okhttp3.Cache и Cache-Control.
Где спотыкаются
Считают 404 и 500 ошибками сети. В колбэке они приходят в onResponse с isSuccessful == false, а onFailure это про разрыв соединения и про сбой разбора тела.
Создают новый Retrofit и новый OkHttpClient на каждый запрос. Пул соединений и диспетчер потоков не переиспользуются, каждое обращение идёт через новое TLS-рукопожатие.
Обновляют токен прямо в интерсепторе без синхронизации. Пять параллельных запросов ловят 401 и уходят на пять обновлений сразу, а сервер в ответ отзывает refresh-токен.