Ktor logo

Ktor

Building Asynchronous Servers and Clients in Kotlin

Releases

Ktor 2.3.0 现已发布

Read this post in other languages:

我们非常高兴地宣布 Ktor 2.3.0 现已正式发布。 此次更新为 Ktor 生态系统带来了许多新功能和改进。 以下部分将简要介绍此版本中的主要变化:

核心改进

WebSockets ContentNegotiation 插件的显式类型

WebSocket ContentNegotiation 插件现在支持指定显式类型:

client.webSocket("ws://localhost:8080/echo") {
    val originalData: Any = Data("hello")
    sendSerialized(originalData, typeInfo<Data>())
    val received = receiveDeserialized<Data>(typeInfo<Data>())

    assertEquals(originalData, received)
}

此功能在无法使用具体化的形参时非常有用。

支持套接字的结构化并发

ktor-network 中的套接字实现现在为 CoroutineScope。 这意味着它支持 cancel() 操作来立即终止连接。

close() 将继续作为正常的关机操作,并将等待所有挂起的操作完成。

删除旧版 JS 配置

即将发布的 Kotlin 1.9.0 版将移除旧版 JS 编译器。 从 Ktor 2.3.0 开始,不再支持旧版编译器。 请考虑迁移到新的 IR 编译器

服务器

支持在路由中使用正则表达式

Ktor 现在允许在定义路由时使用正则表达式。 借助正则表达式路由,您可以轻松匹配复杂的路由并捕获路由形参:

routing {
    get(Regex("^(?&ltname&gt.+)$")) {
        val name = call.parameters["name"]
        call.respondText("Hello, $name!")
    }
}

运作方式如下:

$ curl http://0.0.0.0:8081/Leonid
Hello, Leonid!

您可以在此文档中了解详情。

静态内容 API 清理

静态内容 API 经过完善和简化,可以实现更人性化的用户体验。 这一次,我们重点关注最常见的情况,并为其制作了一个简单的 API:

routing {
    staticFiles("/static", File("files"))
}

将在 /static 路径下提供 files 目录中的所有文件。

我们还可以从资源中提供文件:

routing {
    staticResources("/static", "assets")
}

它还配置将 index.html 作为默认文件提供,并支持预压缩(甚至对于资源)、缓存标头、内容类型检测等功能。

如需详细了解静态内容 API,请参阅此文档

原有 API 仍可使用,并将得到支持。

支持在 CIO 中使用 100 Continue

CIO 引擎现在支持 100 Continue 状态。 它开箱即用,无需额外的配置。

多配置文件支持

通过允许使用多个文件,配置管理得到简化。 可以使用 -config CLI 选项传递多个配置文件。 配置文件将按顺序加载与合并。

请在文档中了解有关配置文件的更多信息。

Jetty 11 和 Tomcat 10 支持

对于已包含存在重大更新的 Jetty 或 Tomcat 依赖项的项目,Ktor 2.3.0 增加了对 Jetty 11 和 Tomcat10 服务器实现的支持。 它们作为单独的依赖项提供:

dependencies {
    implementation("io.ktor:ktor-server-jetty-jakarta:2.3.0")
    implementation("io.ktor:ktor-server-tomcat-jakarta:2.3.0")
    implementation("io.ktor:ktor-server-servlet-jakarta:2.3.0")
}

如果您需要使用新版本,请将依赖项更改为 jakarta 版。 无需迁移。

客户端

Expect 标头和 100 Continue

现在,客户端支持 Expect 标头。 如果要使用,请将 Expect 标头添加到请求中:

client.post("http://localhost:8080/upload") {
    header("Expect", "100-continue")
    body = "Hello, World!"
}

Logging 插件中的敏感标头净化

Logging 插件现在支持净化敏感标头。 可以使用 sanitizeHeader 函数进行配置:

val client = HttpClient {
    install(Logging) {
        sanitizeHeader("<secret>") { it == HttpHeaders.Authorization }
    }
}

对于所有 Authorization 标头,此配置会将标头值替换为占位符。

用于 mingwx64 目标的 libcurl 的静态链接

为了简化版本管理,libcurl 库已静态链接到 ktor-client-curl。 不再需要在系统上安装 libcurl 即可使用依赖项。

Apache 5 和 Jetty 11 支持

新版 Apache 和 Jetty 以单独的依赖项形式添加:

dependencies {
    implementation("io.ktor:ktor-client-jetty-jakarta:2.3.0")
    implementation("io.ktor:ktor-client-apache5:2.3.0")
}

如果您需要使用新版本,请相应地更改依赖项。 无需迁移。

新建项目向导和示例更新

新建项目向导已更新,包含新的 Exposed 和 Postgres 插件,同时添加了新的示例,便于获得更具吸引力的 Ktor 体验。

可以在 GitHub 上找到完整的更改列表。

特别感谢我们的贡献者

非常感谢所有贡献者为改进 Ktor 而付出的时间、精力和专业知识。 特别感谢 chedabobay4toh5ilkurciusInsanusMokrassarbrianguertinsproctorneskRattenkriegmorkipull-vertSebmaster

立即试用

我们邀请您发现 Ktor 2.3.0 中的增强功能,并与我们分享您的宝贵反馈。 如果您刚开始接触 Ktor,可以使用我们的新项目生成器创建新项目。 如需报告问题或建议新功能,请访问 YouTrack

感谢您一如既往的支持!

 

本博文英文原作者: