Kotlin dengan Ktor

1. Gambaran keseluruhan

Ktor adalah rangka kerja untuk membina pelayan dan klien tak segerak dalam sistem yang bersambung menggunakan bahasa pengaturcaraan Kotlin yang kuat. Ini memudahkan pengembangan aplikasi mandiri dengan pelayan terbenam.

Dalam tutorial ini, kita akan meneroka cara membuat aplikasi pelayan yang berdiri sendiri menggunakan Ktor.

2. Menyiapkan Aplikasi Ktor

Mari mulakan dengan menyiapkan projek Ktor. Kami akan menggunakan Gradle yang merupakan pendekatan yang disyorkan dan mudah digunakan. Gradle boleh dipasang dengan mengikuti arahan yang diberikan di laman Gradle .

Buat fail 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' }

Kami telah mengimport pakej pelayan Ktor dan Ktor netty. Netty adalah pelayan tertanam yang akan kami gunakan dalam contoh ini.

3. Membina Pelayan

Kami membuat aplikasi kami dengan menambahkan kod ke folder sumber src / main / kotlin .

Di sini, kami membuat fail APIServer.kt dengan kaedah utama:

fun main(args: Array) { } 

Seterusnya, kami membuat dan memulakan pelayan Netty terbenam:

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

Ia akan membuat dan memulakan pelayan di port 8080 . Kami telah menetapkan kaedah tunggu = benar pada permulaan () untuk mendengar sambungan.

4. Membina API

Mari tambah API. Untuk menangani permintaan HTTP, Ktor menyediakan ciri Routing .

Kami mengaktifkan ciri Routing dengan blok pemasangan di mana kami dapat menentukan laluan untuk laluan tertentu dan kaedah 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)

Dalam contoh ini, pelayan akan menangani permintaan GET untuk path / todo dan akan membalas dengan objek todo JSON . Kami akan mengetahui lebih lanjut mengenai pemasangan ciri di bahagian Memasang Ciri.

5. Menjalankan Pelayan

Untuk menjalankan pelayan, kita memerlukan menjalankan tugas di Gradle:

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

Untuk memulakan pelayan, kami memanggil tugas ini:

./gradlew runServer 

Out API kemudian boleh diakses melalui // localhost: 8080 / todo.

6. Memasang Ciri

Aplikasi Ktor biasanya terdiri daripada serangkaian ciri. Kami dapat memikirkan ciri-ciri sebagai fungsi yang disuntikkan ke saluran permintaan dan respons.

Dengan menggunakan fitur DefaultHeaders , kita dapat menambahkan header pada setiap respons keluar. Routing adalah ciri lain yang membolehkan kita menentukan laluan untuk menangani permintaan, dll.

Kami juga dapat mengembangkan ciri kami dan memasangnya.

Mari kita perhatikan dengan menambahkan header khusus untuk setiap permintaan dengan memasang ciri DefaultHeaders :

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

Begitu juga, kita boleh mengatasi tajuk lalai yang ditetapkan oleh kerangka Ktor itu sendiri:

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

Senarai tajuk lalai yang tersedia boleh didapati di kelas io.ktor.features.DefaultHeaders.

7. Melayan JSON

Membina JSON bertali arus secara manual tidak mudah. Ktor menyediakan ciri untuk melayani objek data sebagai JSON menggunakan Gson .

Mari tambahkan kebergantungan Gson dalam build.gradle kami :

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

Sebagai contoh, kami menggunakan objek data dengan nama Pengarang:

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

Seterusnya, kami memasang ciri gson :

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

Akhirnya, mari kita tambahkan laluan ke pelayan yang melayani objek pengarang sebagai JSON:

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

API pengarang akan memberikan objek data pengarang sebagai JSON .

8. Menambah Pengawal

Untuk memahami bagaimana menangani beberapa permintaan tindakan HTTP mari buat aplikasi TODO yang membolehkan pengguna menambah, menghapus, melihat dan menyenaraikan item TODO.

Kami akan mulakan dengan menambahkan kelas data Todo :

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

Kemudian kami membuat ArrayList untuk menyimpan beberapa item Todo :

val toDoList = ArrayList(); 

Seterusnya, kami menambahkan pengawal untuk menangani permintaan POST, DELETE dan 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); } } }

Kami telah menambah laluan todo dan kemudian memetakan permintaan kata kerja HTTP yang berbeza ke titik akhir itu.

9. Kesimpulannya

Dalam artikel ini, kami telah belajar bagaimana membuat aplikasi pelayan Kotlin dengan kerangka Ktor.

Kami telah membina aplikasi pelayan kecil dalam beberapa minit tanpa menggunakan kod boilerplate.

Seperti biasa, contoh kod boleh didapati di GitHub.