| 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`]. |
| |
| # Example |
| |
| Adding the [`tower_http::trace::TraceLayer`]: |
| |
| ```rust |
| 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"](crate::middleware#writing-middleware) for the different options. |
| |
| If you only want middleware on some routes you can use [`Router::merge`]: |
| |
| ```rust |
| 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; |
| ``` |
| |
| # Multiple middleware |
| |
| It's recommended to use [`tower::ServiceBuilder`] when applying multiple |
| middleware. See [`middleware`](crate::middleware) for more details. |
| |
| # Runs after routing |
| |
| 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"](crate::middleware#rewriting-request-uri-in-middleware) for more |
| details and a workaround. |
| |
| # Error handling |
| |
| See [`middleware`](crate::middleware) for details on how error handling impacts |
| middleware. |