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。