Kotlin avec Ktor

Kotlin avec Ktor

1. Vue d'ensemble

Ktor est une structure 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 intégrés.

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

2. Configurer une application Ktor

Commençons par configurer le projet Ktor. Nous utiliseronsGradle, qui est l’approche recommandée et facile à utiliser. Gradle peut être installé en suivant les instructions fournies sur lesGradle site.

Créez le fichierbuild.gradle:

group 'com.example.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 "https://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 package de serveur Ktor netty. Netty est le serveur intégré que nous utiliserons dans cet exemple.

3. Construire le serveur

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

Ici, nous créons le fichierAPIServer.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 port8080. Nous avons définiwait=true dans la méthodestart() pour écouter les connexions.

4. Construire l'API

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

Nous activons lesRouting feature avec un blocinstall 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 traitera une requêteGET pour le chemin/todo et répondra avec un objettodo JSON Nous en apprendrons plus sur l'installation des fonctionnalités dans la sectionInstalling Features.

5. Lancer le 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 viahttp://localhost:8080/todo.

6. Installation des fonctionnalités

Une application Ktor consiste généralement en une série de fonctionnalités. Nous pourrions considérer les fonctionnalités comme des fonctionnalités injectées dans le pipeline de demandes et de réponses.

En utilisant la fonctionnalitéDefaultHeaders, nous pouvons ajouter des en-têtes à chaque réponse sortante. Routing 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 œil en ajoutant un en-tête personnalisé à chaque requête en installant la fonctionnalitéDefaultHeaders:

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

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 classeio.ktor.features.DefaultHeaders. 

7. Servir JSON

La création manuelle de JSON stringifié n'est pas facile. Ktor fournit une fonctionnalité pour servir des objets de données en tant que JSON en utilisant Gson.

Ajoutons la dépendance Gson dans nosbuild.gradle:

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

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

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("example", "example.com")
    call.respond(author)
}

L'API auteur servira l'objet de données auteur en tant queJSON.

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éesTodo:

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

Ensuite, nous créons unArrayList pour contenir plusieurs élémentsTodo:

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é untodoroute, 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ésover on GitHub.