Usar Ktor Client para hacer peticiones HTTP en Android

Avatar
3 min lectura

Ktor es un framework de servidor y cliente de Kotlin diseñado para crear aplicaciones web y móviles de forma rápida y fácil.

En este artículo, veremos cómo usar Ktor client en una aplicación Android para hacer peticiones a una API.

Configurar las dependencias de Ktor

Antes de comenzar, asegúrate de tener la dependencia de Ktor client en tu archivo build.gradle, así como el plugin de ContentNegotiation:

implementation("io.ktor:ktor-client-core:$ktor_version")
implementation("io.ktor:ktor-client-okhttp:$ktor_version")
implementation("io.ktor:ktor-client-content-negotiation:$ktor_version")

El plugin sirve para convertir objetos en Json. Para que esto funcione correctamente, también necesitas la librería y el plugin Serializable:

plugins {
    ...
    kotlin("plugin.serialization") version "1.6.10"
}

dependencies {
    ...
    implementation("io.ktor:ktor-serialization-kotlinx-json:$ktor_version")
}

Configurar el servidor de Ktor

Para hacer una petición a una API con Ktor client, primero debes crear un objeto HttpClient. Esto se puede hacer de la siguiente manera:

val notesClient = HttpClient() {
    install(ContentNegotiation) {
        json()
    }
}

El bloque de inicialización del HttpClient te permite instalar diferentes “características”, como ContentNegotiation, que se encarga de la serialización y deserialización de datos en formato JSON.

En este caso, estamos usando la librería de Kotlin como serializador, pero se podrían usar otras librerías.

Hacer una petición GET con Ktor

Una vez que tienes tu HttpClient creado, puedes hacer una petición a una API de la siguiente manera:

val response = notesClient.get(NOTES_URL)

En este ejemplo, estamos haciendo una petición GET a la URL especificada y esperamos obtener una respuesta de tipo Note.

Es necesario que el tipo de dato que recibas esté marcado como Serializable, para que el plugin de Kotlin haga su trabajo:

@Serializable
data class Note(...)

También puedes agregar parámetros a tu petición y encabezados HTTP usando el método url:

val response = notesClient.get {
    url(NOTES_URL)
    parameter("param1", "value1")
    header("Authorization", "Bearer abc123")
}

Otros tipos de peticiones

Además de GET, Ktor client también soporta otras operaciones HTTP como POST, PUT y DELETE. Aquí hay un ejemplo de cómo hacer una petición POST con un cuerpo de datos en formato JSON:

notesClient.post(NOTES_URL) {
    setBody(note)
    contentType(ContentType.Application.Json)
}

Ktor está basado en las corrutinas de Kotlin

Es importante tener en cuenta que todas las peticiones HTTP con Ktor client son asíncronas, por lo que deben ser realizadas en un hilo en segundo plano.

En una aplicación Android, esto se puede hacer con el framework de ejecución de tareas de Kotlin Coroutines.

Para usar Coroutines, debes agregar la siguiente dependencia a tu archivo build.gradle:

implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-android:1.6.3")

Luego, puedes hacer una petición GET a una API de la siguiente manera:

suspend fun getAll(): List<Note> {
    val response = notesClient.request(NOTES_URL)
    return response.body()
}

// Llamar a la función desde un contexto de corrutina
scope.launch {
    state = UiState(loading = true)
    val response = NotesRepository.getAll()
    state = UiState(notes = response)
}

Conclusión

Espero que este ejemplo te haya ayudado a entender cómo usar Ktor client para hacer peticiones a una API en una aplicación Android.

Recuerda que Ktor client es muy versátil y puede ser utilizado para muchas otras cosas además de hacer peticiones HTTP, como enviar y recibir WebSockets o realizar descargas de archivos.

¡Explora todas sus características y encuentra la mejor manera de usarlo en tu proyecto!