Ktor 是使用 Kotlin 构建异步服务器和客户端的 Web 框架,上个月发布了重要的新版本 2.0,并于近日发布了首个补丁更新 2.0.1。
Ktor 2.0 引入了许多新功能,以及破坏性变化,官方称这让他们有机会执行一些维护工作并摆脱遗留决策。尽管存在重大变更,但官方表示已尽可能降低其影响,并提供了有助于自动迁移的实用工具。
Ktor 2.0 新特性
Ktor 服务器
简化的可扩展性
Ktor 提供的所有功能均以插件架构构建,“功能”也因此更名为“插件”。对于某些人来说,架构模型会难以理解。2.0 大幅简化了可扩展性 API,使插件更易创建。
看看下面 1.x 的 API 代码
companion object Feature : ApplicationFeature<ApplicationCallPipeline, CustomHeader.Configuration, CustomHeader> { override val key = AttributeKey<CustomHeader>("CustomPlugin" override fun install(pipeline: ApplicationCallPipeline, configure: Configuration.( -> Unit: CustomHeader { val configuration = Configuration(.apply(configure val feature = CustomHeader(configuration
pipeline.intercept(ApplicationCallPipeline.Call {
feature.intercept(this
} return feature
}
}
到了 2.0 中
val myCustomPlugin = createApplicationPlugin("CustomPlugin" { onCall {
} onCallReceive {
} onCallRespond {
}
}
大多数现有插件都已转换为使用新 API,并已覆盖大多数情景。 有关详情,请参见 `CustomHeader` 插件从旧 API 到新 API 的转换,以及插件开发文档。
据官方介绍,他们在可扩展性方面还有更多计划,包括用于从市场轻松发布和使用插件的工具!
Native 支持
在服务器端,除了 GraalVM(从 1.6 开始就已支持)之外,现在还支持 Kotlin/Native,这意味着独立服务器应用程序上有了两种选择。
关于 Kotin/Native 支持,目前仅限于使用 CIO 作为引擎,开发团队将继续在性能领域推进工作。建议使用新的 Kotlin/Native 内存模型。
其他服务器改进
对 Ktor 服务器进行了一系列较小的改进,包括随机端口支持
fun main( {
embeddedServer(Netty, port = 0 {
configureRouting(
}.start(wait = true
}
以及改进的测试 API、类型安全路由、XML 序列化、插件的子路由以及 60 多个错误修正和其他功能。
Ktor 客户端
简化的 API
API 得到进一步简化。在 Ktor 客户端中,引入了新的 API 来处理常见 HTTP 请求
val result = client.post("http://127.0.0.1:$port/" {
}
result.bodyAsText(
新版本已经摆脱了通用的 post<T>, get<T> 方法。 现在,所有内容都返回一个 `HttpResponse`,可供访问正文(使用 `bodyAsText`、`bodyAsChannel`)以及标题。
重试
增加了对重试的内置支持,包括重试之间的时间调整
val client = HttpClient(CIO { install(HttpRequestRetry { maxRetries = 5 retryIf { request, response -> !response.status.isSuccess( } retryOnExceptionIf { _, cause -> cause is NetworkError } delayMillis { retry -> retry * 3000L } // retries in 3, 6, 9, etc. seconds }}
内容协商
如果您一直在服务器中使用内容协商,您应该已经很熟悉这一功能了。 本质上,它就是客户端与服务器协商可以请求和提供的不同类型内容的能力。 在此之前,它的协商方面仅适用于服务器。 现在,客户端也提供了此功能。
val client = HttpClient(CIO { install(ContentNegotiation { }}
这个插件有效取代了 `JsonFeature`。
其他客户端改进
除了上述内容外,客户端还包括用于身份验证的快捷 API(例如 `basic(` 和 `bearer(` 辅助函数)、请求级别的侦听器、新的指标插件、XML 序列化,以及许多错误修正和其他功能。
更多内容查看 Changelog。