1. Información general
Ktor es un marco para construir servidores y clientes asincrónicos en sistemas conectados utilizando el poderoso lenguaje de programación Kotlin. Facilita el desarrollo de una aplicación independiente con servidores integrados.
En este tutorial, vamos a explorar cómo crear una aplicación de servidor independiente usando Ktor.
2. Configuración de una aplicación Ktor
Comencemos por configurar el proyecto Ktor. Usaremos Gradle, que es el enfoque recomendado y fácil de usar. Gradle se puede instalar siguiendo las instrucciones proporcionadas en el sitio de Gradle .
Crea el archivo build.gradle :
group 'com.baeldung.kotlin' version '1.0-SNAPSHOT' buildscript { ext.kotlin_version = '1.2.40' ext.ktor_version = '0.9.2' repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } apply plugin: 'java' apply plugin: 'kotlin' apply plugin: 'application' mainClassName = 'APIServer.kt' sourceCompatibility = 1.8 compileKotlin { kotlinOptions.jvmTarget = "1.8" } compileTestKotlin { kotlinOptions.jvmTarget = "1.8" } kotlin { experimental { coroutines "enable" } } repositories { mavenCentral() jcenter() maven { url "//dl.bintray.com/kotlin/ktor" } } dependencies { compile "io.ktor:ktor-server-netty:$ktor_version" compile "ch.qos.logback:logback-classic:1.2.1" testCompile group: 'junit', name: 'junit', version: '4.12' }
Hemos importado Ktor y el paquete de servidor Netty de Ktor. Netty es el servidor integrado que usaremos en este ejemplo.
3. Construyendo el servidor
Creamos nuestra aplicación agregando código a la carpeta fuente src / main / kotlin .
Aquí, creamos el archivo APIServer.kt con el método principal:
fun main(args: Array) { }
A continuación, creamos e iniciamos el servidor Netty integrado:
embeddedServer(Netty, 8080) { }.start(wait = true)
Creará e iniciará el servidor en el puerto 8080 . Hemos establecido wait = true en el método start () para escuchar conexiones.
4. Construyendo la API
Agreguemos la API. Para manejar solicitudes HTTP, Ktor proporciona la función Enrutamiento .
Activamos la función Enrutamiento con un bloque de instalación donde podemos definir rutas para rutas específicas y métodos HTTP:
val jsonResponse = """{ "id": 1, "task": "Pay waterbill", "description": "Pay water bill today", }""" embeddedServer(Netty, 8080) { install(Routing) { get("/todo") { call.respondText(jsonResponse, ContentType.Application.Json) } } }.start(wait = true)
En este ejemplo, el servidor manejará una solicitud GET para la ruta / todo y responderá con un objeto JSON todo . Aprenderemos más sobre la instalación de funciones en la sección Instalación de funciones.
5. Ejecución del servidor
Para ejecutar el servidor, necesitamos una tarea de ejecución en Gradle:
task runServer(type: JavaExec) { main = 'APIServer' classpath = sourceSets.main.runtimeClasspath }
Para iniciar el servidor, llamamos a esta tarea:
./gradlew runServer
Se puede acceder a la API a través de // localhost: 8080 / todo.
6. Instalación de funciones
Una aplicación de Ktor generalmente consta de una serie de características. Podríamos pensar en las características como una funcionalidad que se inyecta en la canalización de solicitudes y respuestas.
Usando la función DefaultHeaders , podemos agregar encabezados a cada respuesta saliente. El enrutamiento es otra característica que nos permite definir rutas para manejar solicitudes, etc.
También podemos desarrollar nuestras funciones e instalarlas.
Echemos un vistazo agregando un encabezado personalizado a cada solicitud instalando la función DefaultHeaders :
install(DefaultHeaders) { header("X-Developer", "Baeldung") }
Del mismo modo, podemos anular los encabezados predeterminados establecidos por el propio marco de Ktor:
install(DefaultHeaders) { header(HttpHeaders.Server, "My Server") }
La lista de encabezados predeterminados disponibles se puede encontrar en la clase io.ktor.features.DefaultHeaders.
7. Sirviendo JSON
Crear JSON en cadena manualmente no es fácil. Ktor proporciona una función para servir objetos de datos como JSON usando Gson .
Agreguemos la dependencia de Gson en nuestro build.gradle :
compile "io.ktor:ktor-gson:$ktor_version"
Por ejemplo, usamos un objeto de datos con el nombre Autor:
data class Author(val name: String, val website: String)
A continuación, instalamos la función gson :
install(ContentNegotiation) { gson { setPrettyPrinting() } }
Finalmente, agreguemos una ruta al servidor que sirve a un objeto de autor como JSON:
get("/author") { val author = Author("baeldung", "baeldung.com") call.respond(author) }
La API de autor servirá al objeto de datos de autor como JSON .
8. Agregar controladores
Para comprender cómo manejar múltiples solicitudes de acción HTTP, creemos una aplicación TODO que permite al usuario agregar, eliminar, ver y listar elementos TODO.
Comenzaremos agregando una clase de datos Todo :
data class ToDo(var id: Int, val name: String, val description: String, val completed: Boolean)
Luego creamos una ArrayList para contener múltiples elementos Todo :
val toDoList = ArrayList();
A continuación, agregamos los controladores para manejar las solicitudes POST, DELETE y GET:
routing() { route("/todo") { post { var toDo = call.receive(); toDo.id = toDoList.size; toDoList.add(toDo); call.respond("Added") } delete("/{id}") { call.respond(toDoList.removeAt(call.parameters["id"]!!.toInt())); } get("/{id}") { call.respond(toDoList[call.parameters["id"]!!.toInt()]); } get { call.respond(toDoList); } } }
Agregamos una ruta de tareas pendientes y luego asignamos las diferentes solicitudes de verbos HTTP a ese punto final.
9. Conclusión
En este artículo, hemos aprendido cómo crear una aplicación de servidor Kotlin con el marco Ktor.
Hemos creado una pequeña aplicación de servidor en unos minutos sin utilizar ningún código repetitivo.
Como siempre, los ejemplos de código se pueden encontrar en GitHub.