Kotlin con Ktor

1. Panoramica

Ktor è un framework per la creazione di server e client asincroni in sistemi connessi utilizzando il potente linguaggio di programmazione Kotlin. Facilita lo sviluppo di un'applicazione standalone con server incorporati.

In questo tutorial, esploreremo come creare un'applicazione server autonoma utilizzando Ktor.

2. Configurazione di un'applicazione Ktor

Cominciamo impostando il progetto Ktor. Useremo Gradle che è l'approccio consigliato e facile da usare. Gradle può essere installato seguendo le istruzioni fornite sul sito Gradle .

Crea il file 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' }

Abbiamo importato Ktor e il pacchetto del server netty Ktor. Netty è il server incorporato che useremo in questo esempio.

3. Creazione del server

Creiamo la nostra applicazione aggiungendo codice alla cartella sorgente src / main / kotlin .

Qui creiamo il file APIServer.kt con il metodo main:

fun main(args: Array) { } 

Successivamente, creiamo e avviamo il server Netty incorporato:

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

Creerà e avvierà il server sulla porta 8080 . Abbiamo impostato wait = true nel metodo start () per ascoltare le connessioni.

4. Creazione dell'API

Aggiungiamo l'API. Per gestire le richieste HTTP, Ktor fornisce la funzionalità Routing .

Attiviamo la funzionalità Routing con un blocco di installazione in cui possiamo definire percorsi per percorsi specifici e metodi 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)

In questo esempio, il server di gestire una GET richiesta per il percorso / todo e risponderà con un todo oggetto JSON . Impareremo di più sull'installazione delle funzionalità nella sezione Installazione delle funzionalità.

5. Esecuzione del server

Per eseguire il server, abbiamo bisogno di un'attività di esecuzione in Gradle:

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

Per avviare il server, chiamiamo questa attività:

./gradlew runServer 

È quindi possibile accedere all'API Out tramite // localhost: 8080 / todo.

6. Installazione delle funzionalità

Un'applicazione Ktor consiste in genere in una serie di funzionalità. Potremmo pensare alle funzionalità come funzionalità che viene iniettata nella pipeline di richieste e risposte.

Utilizzando la funzione DefaultHeaders , possiamo aggiungere intestazioni a ogni risposta in uscita. Il routing è un'altra funzionalità che ci consente di definire percorsi per gestire le richieste, ecc.

Possiamo anche sviluppare le nostre funzionalità e installarle.

Diamo un'occhiata aggiungendo un'intestazione personalizzata a ciascuna richiesta installando la funzionalità DefaultHeaders :

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

Allo stesso modo, possiamo sovrascrivere le intestazioni predefinite impostate dal framework Ktor stesso:

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

L'elenco delle intestazioni predefinite disponibili può essere trovato nella classe io.ktor.features.DefaultHeaders.

7. Al servizio di JSON

La creazione manuale di JSON con stringhe non è facile. Ktor fornisce una funzionalità per servire gli oggetti dati come JSON utilizzando Gson .

Aggiungiamo la dipendenza Gson nel nostro build.gradle :

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

Ad esempio, utilizziamo un oggetto dati con il nome Autore:

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

Successivamente, installiamo la funzione gson :

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

Infine, aggiungiamo una route al server che serve un oggetto autore come JSON:

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

L'API dell'autore servirà l'oggetto dati dell'autore come JSON .

8. Aggiunta di controller

Per capire come gestire più richieste di azioni HTTP creiamo un'applicazione TODO che consenta all'utente di aggiungere, eliminare, visualizzare ed elencare elementi TODO.

Inizieremo aggiungendo una classe di dati Todo :

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

Quindi creiamo un ArrayList per contenere più elementi Todo :

val toDoList = ArrayList(); 

Successivamente, aggiungiamo i controller per gestire le richieste POST, DELETE e 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); } } }

Abbiamo aggiunto una route todo e quindi mappato le diverse richieste di verbi HTTP a quell'endpoint.

9. Conclusione

In questo articolo, abbiamo imparato come creare un'applicazione server Kotlin con il framework Ktor.

Abbiamo creato una piccola applicazione server in pochi minuti senza utilizzare alcun codice boilerplate.

Come sempre, gli esempi di codice possono essere trovati su GitHub.