Cliente HTTP en Kotlin: haciendo solicitudes correctamente
El desarrollo moderno para Android y servicios backend en Kotlin rara vez prescinde de la interacción con APIs remotas. Crear un cliente HTTP confiable es una tarea básica, de cuya correcta solución depende la estabilidad de toda la aplicación. En este artículo analizaremos cómo hacer solicitudes HTTP en Kotlin utilizando las dos bibliotecas más populares: Ktor Client y OkHttp. Aprenderás a enviar solicitudes GET y POST, procesar JSON, gestionar errores y escribir código limpio y mantenible.
¿Por qué Ktor Client es la elección del desarrollador Kotlin moderno?
Ktor Client es un cliente HTTP asíncrono, creado específicamente para Kotlin por el equipo de JetBrains. Soporta completamente las corrutinas (coroutines), lo que hace que el código sea conciso y seguro. A diferencia de OkHttp, Ktor está diseñado desde el principio teniendo en cuenta la multiplataforma: el mismo código funciona en Android, iOS, JVM, JS y Native.
Instalación de dependencias
Para trabajar con Ktor Client, añade las siguientes dependencias en el archivo build.gradle.kts:
dependencies {
// Cliente básico
implementation("io.ktor:ktor-client-core:2.3.7")
// Motor para JVM (OkHttp o CIO)
implementation("io.ktor:ktor-client-okhttp:2.3.7")
// Para serialización JSON
implementation("io.ktor:ktor-client-content-negotiation:2.3.7")
implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")
// Kotlinx Serialization
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")
}
Solicitud GET simple
Creemos un cliente HTTP y realicemos una solicitud GET a una API de prueba (JSONPlaceholder):
import io.ktor.client.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import kotlinx.coroutines.runBlocking
suspend fun fetchUser(userId: Int): String {
val client = HttpClient {
// Configuración básica
engine {
// Ajustes del motor OkHttp
}
}
val response: HttpResponse = client.get("https://jsonplaceholder.typicode.com/users/$userId")
return response.bodyAsText()
}
fun main() = runBlocking {
val userData = fetchUser(1)
println(userData)
}
Observa: fetchUser es una función suspend. Esto permite llamarla desde una corrutina sin bloquear el hilo.
Solicitud POST con cuerpo JSON
Para enviar datos en formato JSON, conectaremos el plugin ContentNegotiation y definiremos una data class:
import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.client.request.*
import io.ktor.http.*
import io.ktor.serialization.kotlinx.json.*
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
@Serializable
data class Post(val userId: Int, val id: Int? = null, val title: String, val body: String)
suspend fun createPost(post: Post): Post {
val client = HttpClient {
install(ContentNegotiation) {
json(Json {
ignoreUnknownKeys = true
prettyPrint = true
})
}
}
val response: Post = client.post("https://jsonplaceholder.typicode.com/posts") {
contentType(ContentType.Application.Json)
setBody(post)
}.body()
client.close()
return response
}
fun main() = runBlocking {
val newPost = Post(userId = 1, title = "Ktor Client", body = "¡Funciona perfectamente!")
val createdPost = createPost(newPost)
println(createdPost)
}
Punto clave: el plugin ContentNegotiation serializa automáticamente el objeto a JSON y deserializa la respuesta de vuelta a la data class.
OkHttp — el estándar probado para Android
OkHttp sigue siendo el estándar de facto para solicitudes de red en el desarrollo de Android. Es rápido, confiable y soporta p
```