发布日期:2025年1月1日
🎉 新年快乐!
我们很高兴地宣布发布 axum 0.8.0 版本。 axum 是一个基于 tokio、tower 和 hyper 构建的人性化且模块化的 Web 框架。
此次发布还包括 axum-core
、axum-extra
和 axum-macros
的新主要版本。
主要更新
以下是本次版本中最值得注意的一些变化:
路径参数语法变更
路径参数的语法已 从 /:single
和 /*many
更改为 /{single}
和 /{*many}
。
这一更改有多个原因,其中最重要的是旧语法不允许在路由定义中使用前导 :
或 *
字符。新的语法是在升级到 matchit 0.8 后引入的,类似于 format!()
宏的格式,并且也是 OpenAPI 描述中使用的语法。转义使用双大括号 {}
,因此如果你想匹配字面上的 {
或 }
字符,可以写成 {{
或 }}
。
我们理解这对几乎所有 axum 用户来说都是一次破坏性更新,但我们认为现在进行更改比以后在更多用户依赖旧语法时再改更为合适。迁移路径也相对简单,希望这一变化不会给您带来太大困扰。
更多信息和迁移示例可在相应的 Pull Request 中找到。 感谢 David Mládek 在 axum 中的实现,以及 Ibraheem Ahmed 在 matchit 上的持续工作。
Option<T>
作为提取器
Option<T>
作为提取器的使用方式已发生变化。之前,任何来自 T
提取器的拒绝都会被简单地忽略并转换为 None
。
现在,Option<T>
作为提取器需要 T
实现新的 trait OptionalFromRequestParts
(或 OptionalFromRequest
)。
这使得处理来自 T
提取器的拒绝并将其转换为错误响应成为可能,同时仍然允许提取器是可选的。
例如,假设你有一个需要请求中存在有效令牌的 AuthenticatedUser
提取器,但在某些情况下认证是可选的。
现在你可以使用 Option<AuthenticatedUser>
作为提取器,而不会失去在令牌无效或数据库连接失败时返回错误响应的能力。
感谢 Jonas Platte 提交的引入这一新功能的 Pull Request。
移除 #[async_trait]
在 2023 年末,Rust 团队使得在 trait 中使用 impl Future<Output = _>
成为可能。
这一特性称为 trait 中的位置返回 impl Trait,这意味着我们不再需要
#[async_trait]
宏来定义 trait 中的异步方法。
这一变化主要影响我们的 FromRequestParts
和 FromRequest
traits,因为它们使用异步方法。
如果你有实现这些 traits 的自定义提取器,需要移除其中的 #[async_trait]
注解。
这一更改由郑力(Zheng Li)实现。感谢你的贡献!
详细变更日志
以下是 axum 0.8.0 版本的详细变更日志:
破坏性更改 (Breaking Changes)
- 升级 matchit 到 0.8:路径参数语法从
/:single
和/*many
更改为/{single}
和/{*many}
;旧语法会导致 panic 以避免行为的静默变化。#2645 - 要求所有处理器和服务为 Sync:新增到 Router 和 MethodRouter 中的所有处理器和服务现在需要实现
Sync
。#2473 - 元组路径提取器的参数检查:元组和元组结构的 Path 提取器反序列化器现在会严格检查参数数量是否与元组长度匹配。#2931
- 移动 Host 提取器到 axum-extra。#2956
- 移除 WebSocket::close:用户需要显式发送关闭消息。#2974
- 使 serve 泛化:针对监听器和 IO 类型进行泛化。#2941
- 移除 Serve::tcp_nodelay 和 WithGracefulShutdown::tcp_nodelay:参见 serve::ListenerExt 以设置任意 TCP 流属性。#2941
Option<Path<T>>
行为变化:不再吞噬所有错误条件,而是在许多情况下拒绝请求;详见文档。#2475- WebSocket Message 类型变化:
axum::extract::ws::Message
现在使用Bytes
代替Vec<u8>
,并引入了Utf8Bytes
类型代替String
。#3078
修复 (Fixes)
- 跳过 SSE 不兼容字符:在
Event::json_data
中跳过serde_json::RawValue
的不兼容字符。#2992 - 路径段使用数组类型时避免 panic。#3039
- 避免在中间件前设置 content-length:允许中间件为请求添加主体而无需手动设置 content-length。#2897
变更 (Changes)
- 更新最低 Rust 版本:提升到 Rust 1.75。#2943
- 升级 tokio-tungstenite 到 0.26。#3078
- Query/Form 解析错误报告:使用
serde_path_to_error
报告解析失败的字段。#3081