Introducción: ¿Por qué Kotlin y API REST?
\nEl desarrollo web moderno es impensable sin una API REST. Si ya conoces Python y frameworks como Flask o FastAPI, seguramente aprecias la simplicidad y velocidad para crear aplicaciones de servidor. Kotlin, como lenguaje moderno para la JVM, ofrece no menos elegancia y concisión, especialmente en combinación con el framework Ktor.
\nEn este artículo crearemos una API REST completa en Kotlin en 30 minutos. Aprenderás a configurar el proyecto, crear rutas, manejar JSON e iniciar el servidor. Sin rodeos, solo práctica.
\nSi deseas ampliar tu stack tecnológico o simplemente probar Kotlin para el desarrollo backend, esta guía es para ti.
\n\nPaso 1: Configuración del proyecto y dependencias
\nPara empezar, necesitamos un proyecto en Kotlin. Usaremos el gestor de compilación Gradle (o Maven, según tu preferencia). La forma más rápida es crear un proyecto a través de Ktor Project Generator.
\nSelecciona las siguientes opciones:
\n- \n
- Build System: Gradle Kotlin DSL \n
- Engine: Netty (o cualquier otro) \n
- Plugins: Content Negotiation (JSON), Routing, Status Pages \n
Después de descargar el archivo, descomprímelo y ábrelo en IntelliJ IDEA u otro editor.
\nSi creas el proyecto manualmente, agrega las siguientes dependencias en build.gradle.kts:
dependencies {\n implementation("io.ktor:ktor-server-core:2.3.0")\n implementation("io.ktor:ktor-server-netty:2.3.0")\n implementation("io.ktor:ktor-server-content-negotiation:2.3.0")\n implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.0")\n implementation("ch.qos.logback:logback-classic:1.4.11")\n}\nAhora creemos el archivo Application.kt — el punto de entrada de la aplicación.
import io.ktor.server.engine.*\nimport io.ktor.server.netty.*\nimport io.ktor.server.application.*\nimport io.ktor.server.plugins.contentnegotiation.*\nimport io.ktor.serialization.kotlinx.json.*\nimport kotlinx.serialization.json.Json\n\nfun main() {\n embeddedServer(Netty, port = 8080, host = "0.0.0.0") {\n configureSerialization()\n configureRouting()\n }.start(wait = true)\n}\n\nfun Application.configureSerialization() {\n install(ContentNegotiation) {\n json(Json {\n prettyPrint = true\n isLenient = true\n })\n }\n}\n¡Listo! Tenemos una configuración básica para trabajar con JSON y un servidor en el puerto 8080.
\n\nPaso 2: Creación del modelo de datos y almacenamiento
\nPara la API REST necesitamos datos. Creemos un modelo simple User (usuario) y un almacenamiento temporal en memoria.
\nPrimero, definamos una clase de datos con la anotación @Serializable:
import kotlinx.serialization.Serializable\n\n@Serializable\ndata class User(\n val id: Int,\n val name: String,\n val email: String\n)\nAhora creemos un objeto repositorio que almacenará los usuarios:
\nobject UserRepository {\n private val users = mutableListOf(\n User(1, "Iván Ivanov", "ivan@example.com"),\n User(2, "María Petrova", "maria@example.com")\n )\n\n fun getAll(): List<User> = users.toList()\n\n fun getById(id: Int): User? = users.find { it.id == id }\n\n fun add(user: User): User {\n users.add(user)\n return user\n }\n\n fun delete(id: Int): Boolean = users.removeIf { it.id == id }\n}\nEsta es una solución muy simple, pero para una demostración en 30 minutos es perfecta.
\n\nPaso 3: Configuración de rutas (endpoints REST)
\nAhora viene la parte más interesante: crearemos los endpoints para las operaciones CRUD. Agreguemos el archivo Routing.kt:
import io.ktor.server.routing.*\nimport io.ktor.server.response.*\nimport io.ktor.server.request.*\n\nfun Application.configureRouting() {\n routing {\n route("/api/u