Какие инструменты для сетевых запросов кроме Retrofit используются?
Что проверяют
Знаете ли вы, на чём держится Retrofit и чем пользоваться, когда он не подходит: мультиплатформа, GraphQL, стриминг, большие файлы. Следом часто спрашивают, почему в приложении должен быть один экземпляр OkHttpClient.
Как отвечать
Начните с того, что Retrofit сам по сети не ходит: это типизированная обёртка над OkHttp. Дальше альтернативы по назначению:
- OkHttp: основной HTTP-клиент на Android. Пул соединений, HTTP/2, WebSocket, дисковый кеш, интерсепторы для авторизации, логирования и повторов. Его берут напрямую для стриминга, загрузки файлов и WebSocket;
- Ktor Client: клиент на корутинах из Kotlin Multiplatform, выбор по умолчанию, если сетевой слой общий для Android и iOS. Движок подключается отдельно: на Android OkHttp или Android, на iOS Darwin;
- Apollo Kotlin: для GraphQL, генерирует типизированные модели по схеме и запросам, умеет нормализованный кеш;
- gRPC:
grpc-kotlinповерх транспортаgrpc-okhttpдля сервисов на Protobuf; - Cronet: сетевой стек Chromium, поставляется через Google Play Services, поддерживает QUIC и HTTP/3;
HttpURLConnection: встроенный низкоуровневый вариант без зависимостей, но с большим объёмом ручной работы.
Про Volley скажите честно: это старая библиотека Google, она держит ответ целиком в памяти и не подходит для больших загрузок, в новых проектах её почти не берут. Сериализацию обсуждайте отдельно: kotlinx.serialization или Moshi, а Gson для Kotlin хуже, потому что не видит nullability и значения по умолчанию.
Где спотыкаются
Называют заброшенные библиотеки вроде Android Async Http Client. Её давно не поддерживают, и такое упоминание выдаёт ответ, выученный по старой статье.
Создают новый OkHttpClient на каждый запрос. Каждый экземпляр держит свой пул соединений и потоков, поэтому клиент делают синглтоном, а варианты с другими настройками получают через newBuilder().
Забывают про ограничения платформы. Запрос в главном потоке падает с NetworkOnMainThreadException, а при targetSdk 28 и выше открытый HTTP без TLS заблокирован по умолчанию и разрешается только через Network Security Config.