Skip to content

伺服器插件

Ktor 中典型的請求/回應管道如下所示:

請求回應管道

它始於一個請求,該請求被路由到特定的處理器,由我們的應用程式邏輯處理,並最終作出回應。

使用插件新增功能

許多應用程式需要超出應用程式邏輯範圍的常見功能。這可能包括序列化和內容編碼、壓縮、標頭、Cookie 支援等。所有這些都在 Ktor 中透過我們稱之為 插件 的方式提供。

如果我們查看先前的管道圖,插件位於請求/回應與應用程式邏輯之間:

插件管道

當請求進來時:

  • 它透過路由機制被路由到正確的處理器
  • 在交給處理器之前,它會經過一個或多個插件
  • 處理器(應用程式邏輯)處理請求
  • 在回應傳送給客戶端之前,它會經過一個或多個插件

路由是一種插件

插件的設計方式旨在提供最大的靈活性,並允許它們存在於請求/回應管道的任何部分。事實上,我們直到現在一直稱之為 routing 的,不過就是一個插件。

路由作為插件

添加插件依賴

大多數插件都需要特定的依賴項。例如,CORS 插件需要在建構腳本中添加 ktor-server-cors 構件:

Kotlin
Groovy
XML

安裝插件

插件通常在伺服器的初始化階段使用 install 函式進行配置,該函式將一個插件作為參數。根據您 建立伺服器 的方式,您可以在 embeddedServer 呼叫內部安裝插件...

kotlin
import io.ktor.server.application.*
import io.ktor.server.plugins.cors.*
import io.ktor.server.plugins.compression.*
// ...
fun main() {
    embeddedServer(Netty, port = 8080) {
        install(CORS)
        install(Compression)
        // ...
    }.start(wait = true)
}

... 或指定的 模組

kotlin
import io.ktor.server.application.*
import io.ktor.server.plugins.cors.*
import io.ktor.server.plugins.compression.*
// ...
fun Application.module() {
    install(CORS)
    install(Compression)
    // ...
}

除了攔截請求和回應之外,插件還可以有一個可選的配置區塊,在此步驟中進行配置。

例如,在安裝 Cookies 時,我們可以設定某些參數,例如我們希望 Cookie 儲存在何處,或者它們的名稱:

kotlin
install(Sessions) {
    cookie<MyCookie>("MY_COOKIE")
}

安裝插件到特定路由

在 Ktor 中,您不僅可以全域安裝插件,還可以將其安裝到特定的 路由。如果您需要針對不同的應用程式資源使用不同的插件配置,這可能很有用。例如,以下 範例 顯示如何為 /index 路由添加指定的 快取標頭

kotlin
route("/index") {
    install(CachingHeaders) {
        options { call, content -> CachingOptions(CacheControl.MaxAge(maxAgeSeconds = 1800)) }
    }
    get {
        call.respondText("Index page")
    }
}

請注意,以下規則適用於同一個插件的多個安裝:

  • 安裝到特定路由的插件配置會覆寫其 全域配置

  • 路由會合併相同路由的安裝,且最後一次安裝會生效。例如,對於這樣的應用程式...

    kotlin
    routing {
        route("index") {
            install(CachingHeaders) { /* First configuration */ }
            get("a") {
                // ...
            }
        }
        route("index") {
            install(CachingHeaders) { /* Second configuration */ }
            get("b") {
                // ...
            }
        }
    }

"}

... 對 /index/a/index/b 的兩個呼叫都僅由插件的第二次安裝處理。

預設、可用和自訂插件

預設情況下,Ktor 不會啟用任何插件,因此您需要根據應用程式所需的功能自行安裝插件。

然而,Ktor 確實提供各種隨附的插件。您可以在 Ktor 插件註冊表 中查看這些插件的完整列表。

此外,您還可以建立自己的 自訂插件