服务器插件
Ktor 中典型的请求/响应流水线如下所示:

它以请求开始,该请求被路由到特定的处理程序,由我们的应用程序逻辑处理,并最终得到响应。
通过插件添加功能
许多应用程序需要超出应用程序逻辑范围的通用功能。这些可能是序列化和内容编码、压缩、标头、Cookie 支持等。所有这些都在 Ktor 中通过我们所谓的插件提供。
如果我们查看之前的流水线图,插件位于请求/响应与应用程序逻辑之间:

当请求进入时:
- 它通过路由机制被路由到正确的处理程序
- 在移交给处理程序之前,它会经过一个或多个插件
- 处理程序(应用程序逻辑)处理该请求
- 在响应发送到客户端之前,它会经过一个或多个插件
路由是一个插件
插件的设计方式旨在提供最大的灵活性,并允许它们存在于请求/响应流水线的任何环节。 事实上,我们一直称之为 routing 的部分,本质上也不过是一个插件。

添加插件依赖项
大多数插件需要特定的依赖项。例如,CORS 插件需要通过在构建脚本中添加 ktor-server-cors 构件:
安装插件
插件通常在服务器初始化阶段使用 install 函数进行配置,该函数接受一个插件作为参数。根据您创建服务器的方式,您可以在 embeddedServer 调用中安装插件……
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)
}……或者在指定的模块中安装:
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 的位置或其名称:
install(Sessions) {
cookie<MyCookie>("MY_COOKIE")
}为特定路由安装插件
在 Ktor 中,您不仅可以全局安装插件,还可以为特定的路由安装插件。如果您需要为不同的应用程序资源使用不同的插件配置,这会非常有用。例如,下面的示例显示了如何为 /index 路由添加指定的缓存标头:
route("/index") {
install(CachingHeaders) {
options { call, content -> CachingOptions(CacheControl.MaxAge(maxAgeSeconds = 1800)) }
}
get {
call.respondText("Index page")
}
}注意,以下规则适用于同一插件的多次安装:
安装到特定路由的插件配置会覆盖其全局配置。
路由会合并同一路由的安装,且最后一次安装生效。例如,对于这样一个应用程序……
kotlinrouting { route("index") { install(CachingHeaders) { /* 第一次配置 */ } get("a") { // ... } } route("index") { install(CachingHeaders) { /* 第二次配置 */ } get("b") { // ... } } }
"}
……对 /index/a 和 /index/b 的调用都仅由该插件的第二次安装处理。
默认、可用及自定义插件
默认情况下,Ktor 不会激活任何插件,因此需要您根据应用程序所需的功能自行安装插件。
不过,Ktor 确实提供了多种开箱即用的插件。您可以在 Ktor 插件库中查看这些插件的完整列表。
此外,您还可以创建自己的自定义插件。
