Kotlin avec Ktor

1. Vue d'ensemble

Ktor est un framework permettant de créer des serveurs et des clients asynchrones dans des systèmes connectés à l'aide du puissant langage de programmation Kotlin. Il facilite le développement d'une application autonome avec des serveurs embarqués.

Dans ce didacticiel, nous allons explorer comment créer une application serveur autonome à l'aide de Ktor.

2. Configuration d'une application Ktor

Commençons par mettre en place le projet Ktor. Nous utiliserons Gradle qui est l'approche recommandée et facile à utiliser. Gradle peut être installé en suivant les instructions fournies sur le site Gradle .

Créez le fichier 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' }

Nous avons importé Ktor et le paquet serveur Ktor netty. Netty est le serveur intégré que nous utiliserons dans cet exemple.

3. Construction du serveur

Nous créons notre application en ajoutant du code au dossier source src / main / kotlin .

Ici, nous créons le fichier APIServer.kt avec la méthode principale:

fun main(args: Array) { } 

Ensuite, nous créons et démarrons le serveur Netty intégré:

embeddedServer(Netty, 8080) { }.start(wait = true) 

Il créera et démarrera le serveur au port 8080 . Nous avons mis wait = true dans la méthode start () pour écouter les connexions.

4. Construire l'API

Ajoutons l'API. Pour gérer les requêtes HTTP, Ktor fournit la fonction de routage .

Nous activons la fonction de routage avec un bloc d' installation où nous pouvons définir des routes pour des chemins et des méthodes HTTP spécifiques:

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)

Dans cet exemple, le serveur gérera une requête GET pour le chemin / todo et répondra avec un objet JSON todo . Nous en apprendrons plus sur l'installation des fonctionnalités dans la section Installation des fonctionnalités.

5. Exécution du serveur

Pour exécuter le serveur, nous avons besoin d'une tâche d'exécution dans Gradle:

task runServer(type: JavaExec) { main = 'APIServer' classpath = sourceSets.main.runtimeClasspath } 

Pour démarrer le serveur, nous appelons cette tâche:

./gradlew runServer 

Out API est alors accessible via // localhost: 8080 / todo.

6. Installation des fonctionnalités

Une application Ktor se compose généralement d'une série de fonctionnalités. Nous pourrions considérer les fonctionnalités comme des fonctionnalités injectées dans le pipeline de requêtes et de réponses.

En utilisant la fonctionnalité DefaultHeaders , nous pouvons ajouter des en-têtes à chaque réponse sortante. Le routage est une autre fonctionnalité qui nous permet de définir des routes pour gérer les demandes, etc.

Nous pouvons également développer nos fonctionnalités et les installer.

Jetons un coup d'œil en ajoutant un en-tête personnalisé à chaque requête en installant la fonctionnalité DefaultHeaders :

install(DefaultHeaders) { header("X-Developer", "Baeldung") }

De même, nous pouvons remplacer les en-têtes par défaut définis par le framework Ktor lui-même:

install(DefaultHeaders) { header(HttpHeaders.Server, "My Server") }

La liste des en-têtes par défaut disponibles se trouve dans la classe io.ktor.features.DefaultHeaders.

7. Servir JSON

Construire manuellement un JSON stringifié n'est pas facile. Ktor fournit une fonctionnalité pour servir des objets de données en tant que JSON à l'aide de Gson .

Ajoutons la dépendance Gson dans notre build.gradle :

compile "io.ktor:ktor-gson:$ktor_version"

Par exemple, nous utilisons un objet de données avec le nom Auteur:

data class Author(val name: String, val website: String)

Ensuite, nous installons la fonctionnalité gson :

install(ContentNegotiation) { gson { setPrettyPrinting() } }

Enfin, ajoutons une route vers le serveur qui sert un objet auteur en tant que JSON:

get("/author") { val author = Author("baeldung", "baeldung.com") call.respond(author) }

L'API d'auteur servira l'objet de données d'auteur en tant que JSON .

8. Ajout de contrôleurs

Pour comprendre comment gérer plusieurs demandes d'action HTTP, créons une application TODO qui permet à l'utilisateur d'ajouter, de supprimer, d'afficher et de répertorier les éléments TODO.

Nous allons commencer par ajouter une classe de données Todo :

data class ToDo(var id: Int, val name: String, val description: String, val completed: Boolean) 

Ensuite, nous créons une ArrayList pour contenir plusieurs éléments Todo :

val toDoList = ArrayList(); 

Ensuite, nous ajoutons les contrôleurs pour gérer les requêtes POST, DELETE et 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); } } }

Nous avons ajouté une route todo , puis mappé les différentes requêtes de verbes HTTP à ce point de terminaison.

9. Conclusion

Dans cet article, nous avons appris à créer une application serveur Kotlin avec le framework Ktor.

Nous avons créé une petite application serveur en quelques minutes sans utiliser de code standard.

Comme toujours, les exemples de code peuvent être trouvés sur GitHub.