Introducción
Kotlin es un lenguaje de programación moderno y estáticamente tipado que se ejecuta en la Máquina Virtual de Java (JVM) y es completamente compatible con el ecosistema Java. Gracias a su concisión, seguridad y potentes capacidades funcionales, Kotlin se ha convertido en uno de los lenguajes más populares para el desarrollo de aplicaciones de servidor, especialmente después de que Google lo eligiera como lenguaje principal para Android.
En este artículo crearemos una API REST completa en Kotlin, utilizando el framework ligero Ktor y la biblioteca para trabajar con bases de datos Exposed. Implementaremos un servicio simple para la gestión de tareas (Lista de Tareas) con soporte para todas las operaciones CRUD (crear, leer, actualizar, eliminar). Todo el proceso te llevará no más de 30 minutos si ya tienes instalados IntelliJ IDEA y JDK.
1. Configuración del proyecto
Para empezar, crearemos un nuevo proyecto Kotlin con soporte para Gradle. Abre IntelliJ IDEA y selecciona File → New → Project. En el asistente de creación de proyecto, elige Kotlin → JVM.
Paso 1.1: Estructura de build.gradle.kts
Añade las siguientes dependencias al archivo build.gradle.kts:
plugins { kotlin("jvm") version "1.9.0" id("io.ktor.plugin") version "2.3.0" kotlin("plugin.serialization") version "1.9.0"}
dependencies { implementation("io.ktor:ktor-server-core:2.3.0") implementation("io.ktor:ktor-server-netty:2.3.0") implementation("io.ktor:ktor-server-content-negotiation:2.3.0") implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.0") implementation("org.jetbrains.exposed:exposed-core:0.41.1") implementation("org.jetbrains.exposed:exposed-dao:0.41.1") implementation("org.jetbrains.exposed:exposed-jdbc:0.41.1") implementation("com.h2database:h2:2.1.214") implementation("ch.qos.logback:logback-classic:1.4.7")}Estas dependencias incluyen: el propio framework Ktor, soporte para serialización JSON, la biblioteca Exposed para trabajar con la base de datos y la base de datos integrada H2 para pruebas.
Paso 1.2: Punto de entrada
Crea el archivo Application.kt en el paquete com.example:
import io.ktor.server.engine.*import io.ktor.server.netty.*import com.example.plugins.*
fun main() { embeddedServer(Netty, port = 8080) { configureSerialization() configureRouting() }.start(wait = true)}2. Configuración de serialización y enrutamiento
Paso 2.1: Plugins de la aplicación
Crea el directorio plugins y el archivo Serialization.kt:
package com.example.plugins
import io.ktor.serialization.kotlinx.json.*import io.ktor.server.application.*import io.ktor.server.plugins.contentnegotiation.*
fun Application.configureSerialization() { install(ContentNegotiation) { json() }}Paso 2.2: Definición del modelo de datos
Crea el archivo Models.kt:
package com.example.models
import kotlinx.serialization.Serializable
@Serializabledata class Task( val id: Int = 0, val title: String, val description: String = "", val completed: Boolean = false)3. Trabajo con la base de datos
Paso 3.1: Configuración de la conexión
Crea el archivo DatabaseFactory.kt:
package com.example.database
import org.jetbrains.exposed.sql.Databaseimport org.jetbrains.exposed.sql.SchemaUtilsimport org.jetbrains.exposed.sql.transactions.transaction
object DatabaseFactory { fun init() { Database.connect("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", driver = "org.h2.Driver") transaction { SchemaUtils.create(TasksTable) } }}Paso 3.2: Definición de la tabla
En el mismo paquete, crea TasksTable.kt:
package co