iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
Mobile Development

Kotlin 全面啟動 系列 第 21

[Kotlin 全面啟動] Ktor Server

  • 分享至 

  • xImage
  •  

本篇範例會使用 IntelliJ IDEA Ultimate 來建立專案,如果沒有安裝 Ultimate 版本的話也可以參考 https://start.ktor.io/ 來建立 Ktor 專案

建立專案

首先,在 IntelliJ IDEA Ultimate 選 New Project,就會看到以下畫面:

https://ithelp.ithome.com.tw/upload/images/20221004/201204192RWTwDFapH.png

以下說明各個參數意義:

  • Name: 專案名字。
  • Location: 專案存放位置。
  • Build System: 如果大家對 Gradle Kotlin DSL 不陌生的話建議使用,但也可以選擇 Gradle Groovy 或是 Maven。
  • Website: 主要是用來建立我們的 package name
  • Artifact: This field shows a generated artifact name.
  • Ktor version: Ktor 的版本,沒特別需求可以直接使用預設值
  • Engine: 跟我們之前介紹的一樣,Ktor 其實是一套介面,我們可以任意換底層連線的核心,這邊就可以看大家的偏好自行選擇,或是直接使用預設值。
  • Configuration in: 建議先使用預設值。
  • Add sample code: 建議先使用預設值,這樣我們就可以更方便了解 Ktor 的結構。

接下來點下一步就可以安裝一些 plugin 如下圖:

https://ithelp.ithome.com.tw/upload/images/20221004/20120419lDEufU3XVt.png

跟我們在寫 client 的概念一樣,Ktor server 也是一個可以透過 plugin 不斷擴充功能的 library,像是 authentication、serialization 等跟 client 相對應的 plugin 類似,我們目前先選擇 Routing 跟 kotlinx.serialization 然後按 Create 就好了。

雖然我們學習的順序是先 client 再 server,但其實 JetBrains 的開發順序是 server 端先開始的呢!
另外如果某些 plugin 需要其他的 plugin 作為 dependency,wizard 也會自動幫你安裝喔!

程式碼解析

首先我們打開 Application.kt 會發現以下的 main function:

fun main() {
    embeddedServer(Netty, port = 8080, host = "0.0.0.0") {
        configureSerialization()
        configureRouting()
    }.start(wait = true)
}

Ktor 作為一個現代框架,它的結構其實蠻好懂的,我們可以看得出來直接使用 embeddedServer 就可以建立一個 server 了,Netty 就是我們一開始選擇的 server 核心,hostport 就是對外的連線參數,所以理論上我們只要連到 http://0.0.0.0:8080/ 就可以連到我們的 server 囉,而身為同一家公司的產品,IntelliJ IDEA 設計跟其他的 IDE 也都蠻類似的,在 main 的左邊可以看到一個熟悉的綠色 run 按鈕,點下去會發現我們的 server 就跑起來囉,在瀏覽器輸入網址就會看到熟悉的字如下:

Hello World!

不過這個 “Hello World!” 是在哪裡設定的呢,我們的 embeddedServer lambda block 裡面有二個 function,我們點進 configureRouting 看一下會看到以下程式:

fun Application.configureRouting() {
    routing {
        get("/") {
            call.respondText("Hello World!")
        }
    }
}

我們會發現 configureRoutingApplication 下的 extension function,而裡面的 routing function 就建立了整個 routing 的邏輯,get(”/”) 就把 root 的流量導到這個後面的 block 裡,而 respondText 就輸出了我們所看到的 Hello World! 囉!

再回頭看一下 configureSerialization,不出意外地它也是 Application 的 extension function,而這邊的語法也是似曾相似呢,使用 install 來 enable ContentNegotiation 這個 plugin,然後裡面設定為 json 格式:

fun Application.configureSerialization() {
    install(ContentNegotiation) {
        json()
    }
}

這就代表如果我們把昨天建立的物件拿來使用,我們就可以在 client/server 共用一個資料結構了:

@Serializable
data class User(
    val login: String,
    val id: Long,
    @SerialName("avatar_url")
    val avatarUrl: String,
)

再回頭去 routing 加上新的路徑:

routing {
    get("/") {
        // call.respondText("Hello World!")
        call.respond(
            User(
                "Jintin", 
                3413874, 
                "https://avatars.githubusercontent.com/u/3413874"
            )
        )
    }
}

再按一次 run,就可以得到以下的 API response 囉!

{
  login: "Jintin",
  id: 3413874,
  avatar_url: "https://avatars.githubusercontent.com/u/3413874"
}

使用 Kotlin 同時開發 client 跟 server 是不是感覺很讚呢,這也呼應了我們的標題 “Kotlin 全面啟動”呢!Ktor 還有很多功能是我們限於篇幅與時間無法介紹到的,也歡迎大家直接去官網 K 文件,可以得到更完整的資訊~


上一篇
[Kotlin 全面啟動] Ktor Client III
下一篇
[Kotlin 全面啟動] SQLDelight
系列文
Kotlin 全面啟動 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言