Apply a [tower::Layer
] to all routes in the router.
This can be used to add additional processing to a request for a group of routes.
Note that the middleware is only applied to existing routes. So you have to
first add your routes (and / or fallback) and then call layer
afterwards. Additional
routes added after layer
is called will not have the middleware added.
If you want to add middleware to a single handler you can either use
[MethodRouter::layer
] or [Handler::layer
].
Adding the [tower_http::trace::TraceLayer
]:
use axum::{routing::get, Router};
use tower_http::trace::TraceLayer;
let app = Router::new()
.route("/foo", get(|| async {}))
.route("/bar", get(|| async {}))
.layer(TraceLayer::new_for_http());
# let _: Router = app;
If you need to write your own middleware see "Writing middleware" for the different options.
If you only want middleware on some routes you can use [Router::merge
]:
use axum::{routing::get, Router};
use tower_http::{trace::TraceLayer, compression::CompressionLayer};
let with_tracing = Router::new()
.route("/foo", get(|| async {}))
.layer(TraceLayer::new_for_http());
let with_compression = Router::new()
.route("/bar", get(|| async {}))
.layer(CompressionLayer::new());
// Merge everything into one `Router`
let app = Router::new()
.merge(with_tracing)
.merge(with_compression);
# let _: Router = app;
It's recommended to use [tower::ServiceBuilder
] when applying multiple
middleware. See middleware
for more details.
Middleware added with this method will run after routing and thus cannot be used to rewrite the request URI. See "Rewriting request URI in middleware" for more details and a workaround.
See middleware
for details on how error handling impacts
middleware.