1Apply a [`tower::Layer`] to all routes in the router.
2
3This can be used to add additional processing to a request for a group
4of routes.
5
6Note that the middleware is only applied to existing routes. So you have to
7first add your routes (and / or fallback) and then call `layer` afterwards. Additional
8routes added after `layer` is called will not have the middleware added.
9
10If you want to add middleware to a single handler you can either use
11[`MethodRouter::layer`] or [`Handler::layer`].
12
13# Example
14
15Adding the [`tower_http::trace::TraceLayer`]:
16
17```rust
18use axum::{routing::get, Router};
19use tower_http::trace::TraceLayer;
20
21let app = Router::new()
22    .route("/foo", get(|| async {}))
23    .route("/bar", get(|| async {}))
24    .layer(TraceLayer::new_for_http());
25# let _: Router = app;
26```
27
28If you need to write your own middleware see ["Writing
29middleware"](crate::middleware#writing-middleware) for the different options.
30
31If you only want middleware on some routes you can use [`Router::merge`]:
32
33```rust
34use axum::{routing::get, Router};
35use tower_http::{trace::TraceLayer, compression::CompressionLayer};
36
37let with_tracing = Router::new()
38    .route("/foo", get(|| async {}))
39    .layer(TraceLayer::new_for_http());
40
41let with_compression = Router::new()
42    .route("/bar", get(|| async {}))
43    .layer(CompressionLayer::new());
44
45// Merge everything into one `Router`
46let app = Router::new()
47    .merge(with_tracing)
48    .merge(with_compression);
49# let _: Router = app;
50```
51
52# Multiple middleware
53
54It's recommended to use [`tower::ServiceBuilder`] when applying multiple
55middleware. See [`middleware`](crate::middleware) for more details.
56
57# Runs after routing
58
59Middleware added with this method will run _after_ routing and thus cannot be
60used to rewrite the request URI. See ["Rewriting request URI in
61middleware"](crate::middleware#rewriting-request-uri-in-middleware) for more
62details and a workaround.
63
64# Error handling
65
66See [`middleware`](crate::middleware) for details on how error handling impacts
67middleware.
68