Skip to content

Latest commit

 

History

History
67 lines (48 loc) · 1.98 KB

layer.md

File metadata and controls

67 lines (48 loc) · 1.98 KB

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]:

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;

Multiple middleware

It's recommended to use [tower::ServiceBuilder] when applying multiple middleware. See 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" for more details and a workaround.

Error handling

See middleware for details on how error handling impacts middleware.