| Add a fallback [`Handler`] to the router. |
| |
| This service will be called if no routes matches the incoming request. |
| |
| ```rust |
| use axum::{ |
| Router, |
| routing::get, |
| handler::Handler, |
| response::IntoResponse, |
| http::{StatusCode, Uri}, |
| }; |
| |
| let app = Router::new() |
| .route("/foo", get(|| async { /* ... */ })) |
| .fallback(fallback); |
| |
| async fn fallback(uri: Uri) -> (StatusCode, String) { |
| (StatusCode::NOT_FOUND, format!("No route for {}", uri)) |
| } |
| # async { |
| # hyper::Server::bind(&"".parse().unwrap()).serve(app.into_make_service()).await.unwrap(); |
| # }; |
| ``` |
| |
| Fallbacks only apply to routes that aren't matched by anything in the |
| router. If a handler is matched by a request but returns 404 the |
| fallback is not called. |
| |
| # Handling all requests without other routes |
| |
| Using `Router::new().fallback(...)` to accept all request regardless of path or |
| method, if you don't have other routes, isn't optimal: |
| |
| ```rust |
| use axum::Router; |
| |
| async fn handler() {} |
| |
| let app = Router::new().fallback(handler); |
| |
| # async { |
| axum::Server::bind(&"0.0.0.0:3000".parse().unwrap()) |
| .serve(app.into_make_service()) |
| .await |
| .unwrap(); |
| # }; |
| ``` |
| |
| Running the handler directly is faster since it avoids the overhead of routing: |
| |
| ```rust |
| use axum::handler::HandlerWithoutStateExt; |
| |
| async fn handler() {} |
| |
| # async { |
| axum::Server::bind(&"0.0.0.0:3000".parse().unwrap()) |
| .serve(handler.into_make_service()) |
| .await |
| .unwrap(); |
| # }; |
| ``` |