Почти каждое приложение сегодня обменивается данными с сервером: загружает новости, отправляет сообщения или проверяет обновления. В мире Android для этих задач чаще всего используют библиотеку OkHttpClient. Но когда только начинаешь разбираться, непонятно, как её подключить и зачем она вообще нужна. В этой статье я простыми словами объясню, что такое okhttpclient, как настроить HTTP-клиент и отправить первые запросы из приложения на Kotlin.
Что такое OkHttpClient
Представьте, что ваш телефон — это покупатель, а сервер в интернете — магазин. Чтобы купить товар, покупатель должен прийти в магазин, сделать заказ и унести покупку. OkHttpClient — это курьер, который выполняет всю грязную работу: идёт в магазин, передаёт заказ и приносит ответ. В программировании это называется HTTP-клиент. Он умеет отправлять запросы на сервер и получать ответы, не блокируя ваше приложение.
Почему именно OkHttpClient? Его разработала компания Square, та же, что создала Picasso и Retrofit. Библиотека работает быстро, поддерживает HTTP/2 (это ускоряет загрузку) и умеет обрабатывать переподключения при обрывах сети. В Android-разработке она стала стандартом благодаря надёжности и простому API.
Добавление OkHttpClient в проект
Первым делом нужно добавить библиотеку в файл build.gradle.kts на уровне модуля app. Откройте его и впишите dependency. Актуальную версию можно найти на официальном сайте, но на момент написания статьи я рекомендую версию 4.12.0.
dependencies {
implementation("com.squareup.okhttp3:okhttp:4.12.0")
}
После редактирования нажмите Sync Now, чтобы Gradle скачал библиотеку. Теперь вы можете создавать клиент прямо в коде. Дополнительно можно добавить зависимость okhttp3:logging-interceptor для отладки запросов и ответов — это поможет при разработке.
Создание первого клиента
Класс OkHttpClient — это центральная точка библиотеки. Экземпляр клиента настраивается один раз и переиспользуется для всех запросов в приложении. Создавать новый клиент для каждого запроса плохо, потому что каждый экземпляр содержит свой пул соединений и потоки.
val client = OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build()
В этом примере мы задали таймауты: время на соединение и время на чтение ответа. Если сервер не отвечает за 30 секунд, запрос прервётся с ошибкой. Это защищает приложение от зависания.
Выполнение GET-запроса
Самый простой запрос — GET. Он просто запрашивает данные с сервера, ничего не отправляя. Например, получим JSON с информацией о пользователе. Для этого нужен объект Request и вызов newCall.
val request = Request.Builder()
.url("https://api.example.com/users/1")
.build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
// запрос не удался
}
override fun onResponse(call: Call, response: Response) {
val body = response.body?.string()
// обработайте ответ (например, сохраните в базу данных)
}
})
Обратите внимание на слово enqueue — это означает, что запрос выполняется асинхронно в фоновом потоке. Основной поток не зависает, интерфейс остаётся плавным. Для Kotlin-разработчиков также есть расширения, которые позволяют использовать корутины вместо колбэков.
Отправка POST-запроса с телом
POST-запрос нужен, когда вы передаёте данные на сервер: форму регистрации, комментарий, файл. Тело запроса формируется через RequestBody. Чаще всего используют JSON.
val json = """
{
"name": "Иван",
"email": "ivan@example.com"
}
""".trimIndent()
val requestBody = json.toRequestBody("application/json".toMediaTypeOrNull())
val request = Request.Builder()
.url("https://api.example.com/users")
.post(requestBody)
.build()
client.newCall(request).enqueue(/* колбэк */)
Здесь мы превращаем строку JSON в тело запроса и указываем заголовок Content-Type: application/json. Сервер поймёт, что пришли данные в формате JSON, и сможет правильно их обработать.
Обработка ответа и ошибок
Ответ сервера содержит код состояния, заголовки и тело. Самые частые коды: 200 (успех), 404 (не найдено), 500 (ошибка сервера). OkHttpClient не выбрасывает исключений для кодов 404 или 500, он считает их валидными ответами.
override fun onResponse(call: Call, response: Response) {
if (response.isSuccessful) {
val body = response.body?.string()
// успех
} else {
// сервер вернул ошибку
Log.e("HTTP", "Код ошибки: ${response.code}")
}
}
Метод response.isSuccessful возвращает true только для кодов 2xx. Всегда проверяйте успешность, прежде чем извлекать тело ответа, иначе можно получить нечитаемый результат.
Краткий разбор асинхронных вызовов
OkHttpClient предоставляет два способа выполнения запроса:
- execute() — синхронный вызов. Выполняется в текущем потоке, блокируя его до получения ответа. Никогда не используйте его в основном потоке Android.
- enqueue() — асинхронный вызов. Запрос ставится в очередь, а результат приходит позже в отдельном потоке. Для Android это основной вариант.
Если вы используете Retrofit, он внутри себя уже использует OkHttpClient и автоматически работает с корутинами. Но для простых задач или кастомных запросов OkHttpClient напрямую — хороший выбор.
Сравнение OkHttpClient с другими библиотеками
| Библиотека | Уровень абстракции | Когда использовать | Плюсы |
|---|---|---|---|
| OkHttpClient | Низкий (работа с HTTP напрямую) | Тонкая настройка запросов, передача файлов, кастомные интерцепторы | Скорость, контроль, поддержка HTTP/2 |
| Retrofit | Высокий (работа с API как с Kotlin-интерфейсами) | Большинство приложений с REST API | Меньше boilerplate-кода, удобная конвертация JSON |
| Ktor Client | Средний | Кроссплатформенные проекты, где нужен общий код для Android и iOS | Корутины из коробки, поддержка KMP |
Пример: загрузка новостей из API
Чтобы закрепить теорию на практике, представьте, что вы создаёте новостное приложение. С сервера приходит JSON с заголовками статей. Настроим вызов OkHttpClient для получения этого списка.
val client = OkHttpClient()
val request = Request.Builder()
.url("https://newsapi.example.com/latest")
.get()
.build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
// покажите пользователю ошибку соединения
}
override fun onResponse(call: Call, response: Response) {
val jsonString = response.body?.string()
// превратите JSON в список новостей с помощью Gson или Moshi
}
})
После получения строки JSON вы можете использовать библиотеку Gson или Moshi для превращения строки в обычные Kotlin-объекты. OkHttpClient отвечает только за передачу данных, а не за их разбор.
Итоги
Сегодня вы познакомились с okhttpclient и научились выполнять базовые HTTP-запросы. Вы добавили библиотеку в проект, создали клиент с таймаутами, отправили GET и POST запросы, обработали ответ и ошибки. OkHttpClient — это мощный инструмент, который даёт полный контроль над сетью и служит фундаментом для многих популярных Android-библиотек. Начните с простых вызовов, а затем переходите к интерцепторам, аутентификации и загрузке файлов. Умение работать с HTTP — обязательный навык современного разработчика, и OkHttpClient делает этот процесс понятным и приятным.