Cliente HTTP en Kotlin: haciendo solicitudes correctamente de la A a la Z
\nEl desarrollo moderno en Kotlin es impensable sin la interacción con servidores remotos. Ya sea una aplicación móvil en Android o una solución de servidor con Ktor, las solicitudes HTTP son la base del intercambio de datos. En este artículo, analizaremos cómo crear clientes HTTP en Kotlin utilizando las mejores prácticas, bibliotecas populares y un enfoque moderno con corrutinas. Aprenderá a realizar solicitudes GET y POST, manejar errores, trabajar con JSON y construir una arquitectura de capa de red sólida.
\n\n¿Por qué Kotlin es ideal para clientes HTTP?
\nKotlin ofrece una sintaxis concisa, seguridad nula (null safety) y compatibilidad total con el ecosistema Java. Gracias a las corrutinas (coroutines), las solicitudes asíncronas se vuelven intuitivas, sin callbacks engorrosos. Puede escribir código secuencial que se ejecuta de forma asíncrona, lo que simplifica enormemente la lectura y la depuración. Además, Kotlin se utiliza activamente en el desarrollo de Android, donde las solicitudes de red son una tarea cotidiana.
\n\nBibliotecas principales para HTTP en Kotlin
\nHoy en día, los tres enfoques más populares son:
\n- \n
- Ktor Client — cliente multiplataforma de JetBrains. Compatible con JVM, Android, iOS, JS y Native. Ideal para proyectos que necesitan una base de código unificada. \n
- OkHttp + Retrofit — stack clásico para Android/JVM. OkHttp se encarga del trabajo de red de bajo nivel, mientras que Retrofit genera interfaces tipadas. \n
- Fuel — biblioteca ligera con enfoque funcional. Adecuada para proyectos pequeños. \n
En este artículo nos centraremos en Ktor y OkHttp, ya que cubren el 90% de los escenarios.
\n\nConfiguración del proyecto y primeras solicitudes
\nPara empezar, agreguemos las dependencias. Si usa Gradle (Kotlin DSL), incluya Ktor Client:
\ndependencies {\n implementation("io.ktor:ktor-client-core:2.3.7")\n implementation("io.ktor:ktor-client-cio:2.3.7") // motor CIO\n implementation("io.ktor:ktor-client-content-negotiation:2.3.7")\n implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")\n}\nPara OkHttp, las dependencias serán:
\ndependencies {\n implementation("com.squareup.okhttp3:okhttp:4.12.0")\n implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")\n implementation("com.google.code.gson:gson:2.10.1")\n}\n\nSolicitud GET con Ktor Client
\nCreemos un cliente simple y realicemos una solicitud GET a una API pública:
\nimport io.ktor.client.*\nimport io.ktor.client.request.*\nimport io.ktor.client.statement.*\n\nsuspend fun fetchData(): String {\n val client = HttpClient()\n val response: HttpResponse = client.get("https://jsonplaceholder.typicode.com/posts/1")\n val body = response.bodyAsText()\n client.close()\n return body\n}\n\n// Uso en una corrutina\nfun main() = runBlocking {\n println(fetchData())\n}\nTenga en cuenta: suspend es la palabra clave de Kotlin para funciones suspendibles. Esto permite ejecutar la solicitud sin bloquear el hilo.
Solicitud GET con OkHttp
\nUn ejemplo similar con OkHttp se ve así:
\nimport okhttp3.OkHttpClient\nimport okhttp3.Request\n\nfun fetchDataSync(): String {\n val client = OkHttpClient()\n val request = Request.Builder()\n .url("https://jsonplaceholder.typicode.com/posts/1")\n .build()\n client.newCall(request).execute().use { response ->\n return response.body?.string() ?: "Error"\n }\n}\n\n// Llamada en un hilo normal (bloqueante)\nfun main() {\n println(fetchDataSync())\n}\nOkHttp es síncrono por defecto, pero se adapta fácilmente a corrutinas con suspendCancellableCoroutine.
Solicitudes POST y trabajo con JSON
\nEl envío de datos es la segunda operación más importante. Veamos cómo enviar JS