域名 AXUM.RS 将于 2025 年 10 月到期。我们无意再对其进行续费,如果你有意接续这个域名,请与我们取得联系。
  • AXUM.RS 现仅需人民币 3000 元(大写:叁仟元整。接受适度议价
  • 按照行业规则,AXUM.RS 到期后,大概率会进入长时间的赎回期,该期间内,如果你想拥有该域名,将要付出高额的费用
  • 我们已启用 AXUM.EU.ORG 域名,并将持续运营
  • 仅接受微信或支付宝交易
如果你对 AXUM.RS 有兴趣,请和我们进行联系:

中间件

在《axum 的状态共享》中,我们已经用到了中间件:用于添加共享数据的 AddExtension 中间件——它应用于AddExtensionLayerExtension

使用中间件

除了之前章节介绍的共享状态的中间件,我们再演示一个使用 tower 的 tower_http::trace::TraceLayer 中间件的示例。

定义处理函数

async fn foo() -> &'static str {
    "Welcome to axum.rs"
}

async fn bar() -> &'static str {
    "Powered by axum.rs"
}

定义路由并加上中间件

提示,为了能让该中间件正确地打印出日志,需要增加 tracingtracing-subscriber 依赖,并在代码中对其进行初始化:

提示,为了能让该中间件正确地打印出日志,需要增加 tracingtracing-subscriber 依赖,并在代码中对其进行初始化:

if std::env::var_os("RUST_LOG").is_none() {
    std::env::set_var("RUST_LOG", "tower_http=debug,middleware=debug");
}
tracing_subscriber::fmt::init();

自定义中间件

你可以通过实现 tower::Service 来自定义中间件,但它非常复杂,有兴趣可以看看官方示例

好在 axum 提供了更简单的方法:通过extractor_middleware() 方法,将一个 extractor 转成中间件。

作为示例,我们将实现一个只能使用 Firefox 浏览器访问的中间件。如果用户使用 Firefox 浏览器访问,将展示正常信息,如果是用其它浏览器访问,将显示提示信息。

定义 extractor

作为中间件加到路由上

.layer(extractor_middleware::<user_agent::UserAgentInfo>());

本章讲解了 axum 的中间件的使用,以及如何自定义中间件。源码可以在我们的代码库中找到。

本章使用了多个第三方库,如果你对这些库暂时无法理解,可以先跳过。重点是理解如何使用及自定义中间件。

要查看完整内容,请先登录