Можно ли сделать HTTP запросы средствами Android без сторонних библиотек
Что проверяют
Знаете ли вы, что сетевой клиент в платформе уже есть, и понимаете ли, почему команды всё равно берут стороннюю библиотеку. Заодно проверяют базу: поток выполнения, разрешение в манифесте, разбор кодов ответа.
Как отвечать
Да, можно: в SDK есть HttpURLConnection из java.net. Apache-клиент из платформы давно убрали, а HttpURLConnection на Android реализован поверх OkHttp, так что это не «медленный устаревший вариант».
Минимальная схема:
INTERNETв манифесте, иначе запрос отвалится по безопасности;- открыть соединение, задать метод, заголовки и таймауты;
- прочитать
responseCode, взятьinputStreamпри успехе иerrorStreamпри ошибке; - закрыть поток и вызвать
disconnect()вfinally.
val conn = (URL(url).openConnection() as HttpURLConnection).apply {
requestMethod = "GET"
connectTimeout = 10_000
readTimeout = 10_000
}
try {
val ok = conn.responseCode in 200..299
val stream = if (ok) conn.inputStream else conn.errorStream
stream.bufferedReader().use { it.readText() }
} finally {
conn.disconnect()
}Вызывать это надо не на главном потоке: withContext(Dispatchers.IO) в корутине либо свой executor. Дальше честно скажите, зачем в проде библиотека: пул соединений, повторы, интерцепторы для токена и логов, кэш, конвертеры тела, отмена запроса. Писать это руками дороже, чем подключить зависимость.
Где спотыкаются
Первое: показывают код прямо в обработчике нажатия. Сеть на главном потоке даёт NetworkOnMainThreadException, и это не настройка, которую можно отключить, а жёсткий запрет платформы. AsyncTask предлагать тоже не стоит, он устарел.
Второе: читают только inputStream. На ответах 4xx и 5xx он бросает исключение, а тело ошибки лежит в errorStream, и без него вы теряете сообщение сервера и отлаживаете вслепую.
Третье: забывают таймауты и закрытие. Соединение без readTimeout способно висеть минутами, а незакрытый поток ломает переиспользование сокета из пула. Ещё ловят сюрприз с адресом на http://: открытый HTTP по умолчанию заблокирован, нужен HTTPS или явно объявленная политика.