Introducción a los clientes HTTP en Kotlin
El desarrollo moderno en Kotlin es impensable sin la interacción con APIs remotas y servicios web. Un cliente HTTP es una herramienta fundamental que permite a tu aplicación enviar solicitudes y recibir respuestas de internet. Ya sea que estés creando una aplicación móvil, un backend de servidor o una aplicación de escritorio, saber cómo trabajar correctamente con solicitudes HTTP es una habilidad obligatoria para todo desarrollador de Kotlin.
En este artículo, analizaremos en detalle qué bibliotecas están disponibles para trabajar con HTTP en el ecosistema de Kotlin, cómo realizar solicitudes GET y POST, procesar JSON y gestionar la asincronía. Aprenderás cómo evitar errores típicos y hacer que tu código sea robusto y eficiente.
Bibliotecas principales para clientes HTTP en Kotlin
1. Ktor Client
Ktor es un framework asíncrono moderno, creado por la empresa JetBrains específicamente para Kotlin. Ktor Client admite corrutinas, multiplataforma (JVM, Android, iOS, JS, Native) y proporciona un motor flexible y configurable.
Ejemplo de una solicitud GET básica con Ktor:
import io.ktor.client.*import io.ktor.client.request.*import io.ktor.client.statement.*
suspend fun fetchData(): String { val client = HttpClient() val response: HttpResponse = client.get("https://api.example.com/data") client.close() return response.bodyAsText()}2. OkHttp
OkHttp es una de las bibliotecas más populares para Java y Android, que funciona perfectamente también con Kotlin. Se destaca por su alto rendimiento, soporte para HTTP/2, pool automático de conexiones e interceptores (interceptors).
Ejemplo de una solicitud GET síncrona con OkHttp:
import okhttp3.OkHttpClientimport okhttp3.Request
fun fetchData(): String { val client = OkHttpClient() val request = Request.Builder() .url("https://api.example.com/data") .build() client.newCall(request).execute().use { response -> return response.body?.string() ?: "" }}3. Fuel
Fuel es una biblioteca ligera e intuitiva para Kotlin, construida sobre OkHttp. Ofrece un estilo funcional para trabajar con solicitudes y un manejo conveniente de los resultados.
Ejemplo de una solicitud GET con Fuel:
import com.github.kittinunf.fuel.httpGetimport com.github.kittinunf.result.Result
fun fetchData() { "https://api.example.com/data" .httpGet() .responseString { _, _, result -> when (result) { is Result.Success -> println(result.value) is Result.Failure -> println(result.error) } }}Cómo enviar correctamente solicitudes GET y POST
Solicitudes GET
Las solicitudes GET se utilizan para obtener datos del servidor. Los parámetros de la solicitud generalmente se pasan en la URL. Al usar Ktor, los parámetros se pueden agregar mediante el bloque parameter:
val client = HttpClient()val response = client.get("https://api.example.com/search") { parameter("query", "Kotlin") parameter("page", 1)}Es importante recordar: las solicitudes GET no deben modificar el estado del servidor y no deben contener un cuerpo de solicitud. Todos los datos se transmiten a través de la URL o los encabezados.
Solicitudes POST
Las solicitudes POST están diseñadas para enviar datos al servidor (por ejemplo, crear un nuevo recurso). El cuerpo de la solicitud puede estar en formato JSON, Form URL Encoded o Multipart.
Ejemplo de una solicitud POST con cuerpo JSON a través de Ktor:
import io.ktor.client.request.*import io.ktor.http.*
data class User(val name: String, val email: String)
suspend fun createUser(user: User): String { val client = HttpClient() val response = client.post("https://api.example.com/users") { contentTyp