Ktor
Building Asynchronous Servers and Clients in Kotlin
Ktor 2.3.0 现已发布
我们非常高兴地宣布 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("^(?<name>.+)$")) { 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 而付出的时间、精力和专业知识。 特别感谢 chedabob、ay4toh5i、lkurcius、InsanusMokrassar、brianguertin、sproctor、nesk、Rattenkrieg、morki、pull-vert、Sebmaster。
立即试用
我们邀请您发现 Ktor 2.3.0 中的增强功能,并与我们分享您的宝贵反馈。 如果您刚开始接触 Ktor,可以使用我们的新项目生成器创建新项目。 如需报告问题或建议新功能,请访问 YouTrack。
感谢您一如既往的支持!
本博文英文原作者: