Ktor 3.6.0 现已发布!

Ktor 3.6.0 现已发布!

💡 原文英文,约1000词,阅读约需4分钟。
📝

内容提要

Ktor 3.6.0 发布,新增类型安全认证(含 OpenID Connect 插件),Netty 引擎实验性支持 HTTP/3,改进路由与请求处理,支持 Uuid 等类型转换及可空接收。客户端 ContentNegotiation 可跳过 Accept 头合并,并推出 KMP 默认引擎集与基于 kotlinx-io 的缓存存储,简化多平台配置。

🔎

延伸解读

类型安全认证:从隐式到显式

Ktor 3.6.0 引入类型安全认证,改变了以往依赖隐式类型桥接配置与路由的方式。新模块提供类型保证,支持基于角色的访问和匿名用户,并利用上下文参数实现更简洁的语法。例如,JWT 认证可返回自定义 User 类型,路由中直接获取 call.principal 而无需强制转换。这减少了运行时错误,提升了代码可维护性,尤其适合复杂认证场景。

OpenID Connect 插件:简化第三方登录集成

新的 Oidc 插件旨在降低通过 OpenID Connect 提供商保护服务的复杂性。它允许创建类型化的认证提供者,支持所有 OpenID Connect 特性,包括会话、带自动刷新令牌的浏览器登录界面等。示例中展示了如何配置 Auth0 身份提供者,并在路由中通过 authenticateWith 使用。这为需要集成外部身份验证的开发者提供了更便捷、类型安全的方案。

Netty 引擎实验性 HTTP/3 与多协议支持

Netty 服务器引擎新增实验性 HTTP/3 over QUIC 支持,需配置 SSL 连接器并通过 enableHttp3 启用,还可调整 QUIC 特定设置如流控限制和 UDP 套接字。此外,Netty 现在可在同一服务器上同时启用 h2c 和 HTTP/2 over TLS,通过 enableH2c 和 enableHttp2 配置。这些改进为需要前沿协议支持的场景提供了可能,但 HTTP/3 仍处于实验阶段,建议反馈使用体验。

Kotlin 多平台客户端配置简化

Ktor 3.6.0 推出 ktor-client-engine-defaults,为 KMP 项目提供精选的客户端引擎集。在 commonMain 中添加依赖后,可直接创建 HttpClient() 而无需在共享代码中选择引擎,Ktor 会为每个目标自动选择可用引擎。同时,HTTP 缓存改用 kotlinx-io 的 Path,使持久化存储不再局限于 JVM。这些改进让 KMP 客户端设置更简单自然,同时保留按平台配置特定引擎的灵活性。

Q&A

Ktor 3.6.0 在认证方面有哪些新特性?

Ktor 3.6.0 引入了类型安全认证,提供新类型保证复杂认证的完全类型安全,支持基于角色的访问和匿名用户,并利用上下文参数实现更优雅的语法。同时新增 OpenID Connect (Oidc) 插件,可创建类型化认证提供者,支持所有 OpenID Connect 特性、会话、浏览器登录界面和自动刷新令牌。

Ktor 3.6.0 的 Netty 引擎对 HTTP/3 的支持情况如何?

Netty 服务器引擎现在实验性支持基于 QUIC 的 HTTP/3。要启用,需配置 SSL 连接器,然后通过 enableHttp3 { } 选择加入,该块还可调整 QUIC 特定设置,如流控限制和 UDP 套接字配置。此外,Netty 服务器现在可以在一个连接器上提供 h2c,在另一个上提供基于 TLS 的 HTTP/2,通过 enableH2c = true 和 enableHttp2 = true 启用。

Ktor 3.6.0 在路由和请求处理方面做了哪些改进?

请求参数转换现在支持 Kotlin 的 Uuid、Byte 和无符号数值类型。ApplicationCall.receive() 现在也接受可空类型,使路由契约更明确,并弃用了 receiveNullable()。此外,新增 respondHtmlPartial 替代已弃用的 respondHtmlFragment,使用 TagConsumer<Appendable> 可响应不受限制的部分 HTML。

Ktor 3.6.0 如何让 Kotlin Multiplatform 客户端配置更简单?

Ktor 3.6.0 引入了 ktor-client-engine-defaults,这是一组为 Kotlin Multiplatform 项目精选的客户端引擎。将其添加到 commonMain,即可在共享代码中创建 HttpClient() 而无需选择引擎,Ktor 会为每个目标选择适当的可用引擎。同时,HTTP 缓存现在使用 kotlinx-io 的 Path,使持久化 HttpCache 存储不再局限于 JVM 的 java.io.File API,从而简化了带缓存的 KMP 客户端设置。

Ktor 3.6.0 中客户端 ContentNegotiation 插件有什么新控制选项?

客户端 ContentNegotiation 插件过去会将注册的内容类型合并到每个 Accept 头中。新增 ContentTypeMergeStrategy.SkipIfPresent 策略,当请求有显式 Accept 头时,该头会优先,插件不再合并;当请求没有 Accept 头时,插件仍会像往常一样添加注册的内容类型。

Ktor 3.6.0 还包含哪些其他值得关注的更新?

除了主要特性外,Ktor 3.6.0 还包括:JVM 的 WebRTC 支持、CIO 的异步 DNS 解析、OpenAPI 标签描述、重复 cookie 解析以及 JavaScript fetch() 覆盖等。完整变更列表可查看 What's New in Ktor 3.6.0。

🏷️

标签

➡️

继续阅读