Kotlin met Ktor

1. Overzicht

Ktor is een raamwerk voor het bouwen van asynchrone servers en clients in verbonden systemen met behulp van de krachtige programmeertaal Kotlin. Het vergemakkelijkt het ontwikkelen van een stand-alone applicatie met embedded servers.

In deze tutorial gaan we onderzoeken hoe we een zelfstandige servertoepassing kunnen maken met Ktor.

2. Een Ktor-applicatie opzetten

Laten we beginnen met het opzetten van het Ktor-project. We zullen gebruiken Grijpen dat is de aanbevolen en gemakkelijk te gebruiken aanpak. Gradle kan worden geïnstalleerd door de instructies op het Grijpen site.

Maak het build.gradle het dossier:

groep 'com.baeldung.kotlin' versie '1.0-SNAPSHOT' buildscript {ext.kotlin_version = '1.2.40' ext.ktor_version = '0.9.2' opslagplaatsen {mavenCentral ()} afhankelijkheden {classpath "org.jetbrains.kotlin: kotlin-gradle-plugin: $ kotlin_version "}} plug-in toepassen: 'java' plug-in toepassen: 'kotlin' plug-in toepassen: 'applicatie' mainClassName = 'APIServer.kt' sourceCompatibility = 1.8 compileKotlin {kotlinOptions.jvmTarget =" 1.8 "} compileTestKotlin {kotlinOptions.jvmTarget = "1.8"} kotlin {experimentele {coroutines "enable"}} opslagplaatsen {mavenCentral () jcenter () maven {url "//dl.bintray.com/kotlin/ktor"}} afhankelijkheden {compileren "io .ktor: ktor-server-netty: $ ktor_version "compileren" ch.qos.logback: logback-classic: 1.2.1 "testCompile groep: 'junit', naam: 'junit', versie: '4.12'}

We hebben Ktor en het Ktor netty-serverpakket geïmporteerd. Netty is de embedded server die we in dit voorbeeld zullen gebruiken.

3. Bouwen aan de server

We maken onze applicatie door code toe te voegen aan de bronmap src / main / kotlin.

Hier maken we het bestand aan APIServer.kt met de belangrijkste methode:

fun main (args: Array) {} 

Vervolgens maken en starten we de embedded Netty-server:

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

Het zal de server op poort maken en starten 8080. We hebben gezet wait = true in de begin() methode om naar verbindingen te luisteren.

4. Het bouwen van de API

Laten we de API toevoegen. Om HTTP-verzoeken af ​​te handelen, biedt Ktor de Routing voorzien zijn van.

We activeren het Routing-functie Met een installeren blok waar we routes kunnen definiëren voor specifieke paden en HTTP-methoden:

val jsonResponse = "" "{" id ": 1," task ":" Betaal waterrekening "," description ":" Betaal waterrekening vandaag ",}" "" embeddedServer (Netty, 8080) {install (Routing) {get ("/ todo") {call.respondText (jsonResponse, ContentType.Application.Json)}}} .start (wait = true)

In dit voorbeeld zal de server een KRIJGEN verzoek om het pad /Te doen en zal antwoorden met een Te doen JSON-object. We leren meer over het installeren van functies in de sectie Functies installeren.

5. De server draaien

Om de server te laten draaien, hebben we een run-taak nodig in Gradle:

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

Om de server te starten, noemen we deze taak:

./gradlew runServer 

Out API is dan toegankelijk via // localhost: 8080 / todo.

6. Functies installeren

Een Ktor-applicatie bestaat doorgaans uit een reeks functies. We zouden functies kunnen beschouwen als functionaliteit die in de verzoek- en antwoordpijplijn wordt geïnjecteerd.

De ... gebruiken DefaultHeaders functie kunnen we kopteksten toevoegen aan elk uitgaand antwoord. Routing is een andere functie waarmee we routes kunnen definiëren om verzoeken te behandelen, enz.

We kunnen ook onze functies ontwikkelen en installeren.

Laten we eens kijken door een aangepaste koptekst aan elk verzoek toe te voegen door het DefaultHeaders voorzien zijn van:

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

Evenzo kunnen we de standaard headers overschrijven die door het Ktor-framework zelf zijn ingesteld:

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

De lijst met beschikbare standaardheaders is te vinden in de klas io.ktor.features.DefaultHeaders.

7. Dienen JSON

Het handmatig opbouwen van stringified JSON is niet eenvoudig. Ktor biedt een functie om gegevensobjecten als JSON te dienen met Gson.

Laten we de Gson-afhankelijkheid toevoegen aan onze build.gradle:

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

We gebruiken bijvoorbeeld een data-object met de naam Schrijver:

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

Vervolgens installeren we het gson voorzien zijn van:

installeer (ContentNegotiation) {gson {setPrettyPrinting ()}}

Laten we tot slot een route naar de server toevoegen die een auteurobject als JSON bedient:

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

De auteur-API zal het auteursgegevensobject dienen als JSON.

8. Controllers toevoegen

Om te begrijpen hoe meerdere HTTP-actieverzoeken moeten worden afgehandeld, maken we een TODO-applicatie waarmee de gebruiker TODO-items kan toevoegen, verwijderen, bekijken en weergeven.

We beginnen met het toevoegen van een Te doen dataklasse:

dataklasse ToDo (var id: Int, val naam: String, val beschrijving: String, val voltooid: Boolean) 

Vervolgens maken we een ArrayList om meerdere te houden Te doen items:

val toDoList = ArrayList (); 

Vervolgens voegen we de controllers toe om POST-, DELETE- en GET-verzoeken af ​​te handelen:

routing () {route ("/ todo") {post {var toDo = call.receive (); toDo.id = toDoList.size; toDoList.add (toDo); call.respond ("Toegevoegd")} delete ("/ {id}") {call.respond (toDoList.removeAt (call.parameters ["id"] !!. toInt ())); } get ("/ {id}") {call.respond (toDoList [call.parameters ["id"] !!. toInt ()]); } krijg {call.respond (toDoList); }}}

We hebben een Te doenroute en vervolgens de verschillende HTTP-werkwoordverzoeken aan dat eindpunt toegewezen.

9. Conclusie

In dit artikel hebben we geleerd hoe u een Kotlin-servertoepassing maakt met het Ktor-framework.

We hebben in een paar minuten een kleine servertoepassing gebouwd zonder enige standaardcode te gebruiken.

Zoals altijd zijn de codevoorbeelden te vinden op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found