Ktor 2.0.1 发布,Kotlin 异步框架

Ktor 是使用 Kotlin 构建异步服务器和客户端的 Web 框架,上个月发布了重要的新版本 2.0,并于近日发布了首个补丁更新 2.0.1。
Ktor 2.0 引入了许多新功能,以及破坏性变化

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。

关于作者: qwephp

.

为您推荐