Application 是什么?

预计阅读时间: 2 分钟

Ktor 服务器应用(Application)是使用已配置的服务器引擎监听一个或多个端口的自定义程序, 由带有应用逻辑的模块组成,其中安装了一系列特性,如路由会话压缩 等,以处理 HTTP/S 1.x/2.x 与 WebSocket 请求。

Ktor 还提供了处理原始套接字的功能,不过并不作为 Application 及其流水线的一部分。

目录:

Application

Application 实例是 Ktor 应用的主要单元。当请求 (可以是 HTTP、 HTTP/2 或者 WebSocket 请求)进来时,将其转换为 ApplicationCall 并经过一个隶属于 Application 的流水线。该流水线由一到多个先前安装的拦截器组成,提供像路由、 压缩这样的结束请求处理的功能。

通常 Ktor 程序通过模块来配置 Application 的流水线, 在其中安装并配置特性

关于流水线的更多信息可参阅生命周期一节。

ApplicationCall

参见关于 ApplicationCall 专有页

特性

特性是可以为流水线安装并配置的单例(通常是伴生对象)。 Ktor 包含一些标准的特性,不过可以添加自己的或者社区中的其他特性。 任何流水线中都可以安装特性,例如在应用自身中,或者指定的路由中。

更多相关内容请参阅特性专有页。

模块

Ktor 模块只是一个接收者为 Application 类的用户自定义函数,负责配置服务器流水线、安装特性、注册路由、处理请求等。

必须在 application.conf 文件中指定服务器启动时要加载的模块。

一个简单的模块函数如下所示:

Main.kt
package com.example.myapp

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

当然,也可以将模块函数拆分为几个较小的函数或者类。

使用完整限定名来引用模块:类的完整限定名与方法名, 以点(.)分隔。

因此对于该示例,其模块的完整限定名为:

com.example.myapp.MainKt.mymodule

mymoduleApplication 类的一个扩展方法(其中 Application接收者)。 由于它已定义成顶层函数,Kotlin 会创建一个后缀为 Kt 的 JVM 类(FileNameKt), 并将扩展方法添加为该类的静态方法,其接收者作为该静态方法的第一个参数。 在本例中,类名是 com.example.myapp 包中的 MainKt,而其 Java 方法的签名为 static public void mymodule(Application app)