宣布 axum 0.8.0

2025年1月1日

新年快乐!🎉

今天,我们很高兴宣布 axum 版本 0.8。axum 是一个符合人体工程学且模块化的 Web 框架,它基于 tokiotowerhyper 构建。

本次发布还包括 axum-coreaxum-extraaxum-macros 的新主要版本。

以下是此版本中最值得注意的一些更改

路径参数语法更改

路径参数语法已从 /:single/*many 更改为 /{single}/{*many}

进行此更改的原因有很多,但最重要的是旧语法不允许路由定义以 :* 字符开头。

这个新语法是在我们升级到 matchit 0.8 时引入的。它应该与 format!() 宏感觉有些相似,并且它也是 OpenAPI 描述中正在使用的语法。转义使用双大括号完成,因此,如果您想匹配文字 {} 字符,您可以通过编写 {{}} 来实现。

我们理解这对几乎所有 axum 用户来说都是一个重大更改,但我们认为现在进行此更改比以后在更多用户依赖旧语法时再进行更改要好。迁移路径也应该相对简单,因此我们希望此更改不会给您带来太多麻烦。

您可以在相应的 pull request 中找到更多信息和迁移示例。感谢 David Mládekaxum 中的实现,以及 Ibraheem Ahmedmatchit 的持续工作。

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 中定义异步方法。

此更改主要影响我们的 FromRequestPartsFromRequest trait,因为它们使用异步方法。如果您有实现这些 trait 的自定义提取器,则需要从中删除 #[async_trait] 注解。

这个更改Zheng Li 实现。感谢您的贡献!

查看更新日志了解更多信息

此版本还有更多更改,包括新功能、错误修复和不太明显的重大更改。我们鼓励您阅读更新日志以查看所有更改!

此外,如果您在更新时遇到问题,请开启 GitHub 讨论。也欢迎您在 Discord 中提问。

最后,我们要感谢所有帮助实现此版本的贡献者。非常感谢您的工作!