Introducción a Ktor, el servidor HTTP para Kotlin

Ktor es el servidor HTTP oficial para Kotlin. Aprovecha la concurrencia nativa y el poder expresivo del lenguaje para construir endpoints de forma limpia y eficiente.

Configuración inicial de Ktor ⚙️

Puedes generar un proyecto desde el generador web de Ktor. Asegúrate de incluir la HTML DSL.

Una vez descargado, simplemente ejecuta:

./gradlew run

Al acceder a localhost:8080, recibirás el mensaje “Hello, World!”.

Definiendo rutas

Ejemplo de ruta básica:

routing {
    get("/") {
        call.respondText("Hello World!")
    }
}
  • call.respondText() devuelve texto plano.
  • get("/") define una solicitud GET en la raíz.
  • routing agrupa las rutas de la aplicación.

Generación de HTML con la DSL de Kotlin

Puedes usar la DSL de Ktor para generar HTML de forma declarativa:

call.respondHtml {
    body {
        h1 { +"Frases célebres" }
        ul {
            listOf(...).forEach { (frase, autor) ->
                li {
                    p { +frase }
                    p { +"― $autor" }
                }
            }
        }
    }
}

Cada etiqueta HTML tiene su correspondiente función en Kotlin. Es posible mezclar lógica y estructura de forma clara y legible.


Parámetros en las rutas

Ejemplo de ruta con parámetro opcional:

get("/quotes/{author?}") {
    val author = call.parameters["author"]
    val filtradas = if (author != null) {
        quotes.filter { it.second.equals(author, ignoreCase = true) }
    } else {
        quotes
    }
    call.respondHtml { ... }
}

Esto permite filtrar las frases por autor desde la URL.


Manejo de formularios y solicitudes POST

Formulario HTML:

get("/add-quote") {
    call.respondHtml {
        form(method = FormMethod.post, action = "/quotes") {
            textInput(name = "quote") {}
            textInput(name = "author") {}
            submitInput { +"Agregar frase" }
        }
    }
}

Manejo del POST:

post("/quotes") {
    val params = call.receiveParameters()
    val quote = params["quote"] ?: ""
    val author = params["author"] ?: ""
    quotes.add(quote to author)
    call.respondRedirect("/quotes")
}

Plugins y registro de peticiones

Puedes crear un plugin personalizado para registrar las peticiones entrantes:

val RequestLoggingPlugin = createApplicationPlugin("RequestLoggingPlugin") {
    onCall { call ->
        println("URL solicitada: ${call.request.local.uri}")
    }
}

Se instala en el module de la aplicación:

fun Application.module() {
    configureRouting()
    install(RequestLoggingPlugin)
}

Conclusión

Ktor es un servidor HTTP moderno y eficaz, diseñado para aprovechar las ventajas del lenguaje Kotlin. Su sintaxis clara y su arquitectura extensible lo convierten en una opción poderosa para el desarrollo web.

En el próximo artículo se cubrirá la persistencia de datos y el uso de HTMX para crear interfaces dinámicas sin JavaScript complejo.