Add another route to the router.
path
is a string of path segments separated by /
. Each segment can be either static, a capture, or a wildcard.
method_router
is the [MethodRouter
] that should receive the request if the path matches path
. method_router
will commonly be a handler wrapped in a method router like get
. See handler
for more details on handlers.
Examples:
/
/foo
/users/123
If the incoming request matches the path exactly the corresponding service will be called.
Paths can contain segments like /:key
which matches any single segment and will store the value captured at key
.
Examples:
/:key
/users/:id
/users/:id/tweets
Captures can be extracted using Path
. See its documentation for more details.
It is not possible to create segments that only match some types like numbers or regular expression. You must handle that manually in your handlers.
MatchedPath
can be used to extract the matched path rather than the actual path.
Paths can end in /*key
which matches all segments and will store the segments captured at key
.
Examples:
/*key
/assets/*path
/:id/:repo/*tree
Note that /*key
doesn't match empty segments. Thus:
/*key
doesn't match /
but does match /a
, /a/
, etc./x/*key
doesn't match /x
or /x/
but does match /x/a
, /x/a/
, etc.Wildcard captures can also be extracted using Path
. Note that the leading slash is not included, i.e. for the route /foo/*rest
and the path /foo/bar/baz
the value of rest
will be bar/baz
.
To accept multiple methods for the same route you can add all handlers at the same time:
use axum::{Router, routing::{get, delete}, extract::Path}; let app = Router::new().route( "/", get(get_root).post(post_root).delete(delete_root), ); async fn get_root() {} async fn post_root() {} async fn delete_root() {} # async { # axum::Server::bind(&"".parse().unwrap()).serve(app.into_make_service()).await.unwrap(); # };
Or you can add them one by one:
# use axum::Router; # use axum::routing::{get, post, delete}; # let app = Router::new() .route("/", get(get_root)) .route("/", post(post_root)) .route("/", delete(delete_root)); # # let _: Router = app; # async fn get_root() {} # async fn post_root() {} # async fn delete_root() {}
use axum::{Router, routing::{get, delete}, extract::Path}; let app = Router::new() .route("/", get(root)) .route("/users", get(list_users).post(create_user)) .route("/users/:id", get(show_user)) .route("/api/:version/users/:id/action", delete(do_users_action)) .route("/assets/*path", get(serve_asset)); async fn root() {} async fn list_users() {} async fn create_user() {} async fn show_user(Path(id): Path<u64>) {} async fn do_users_action(Path((version, id)): Path<(String, u64)>) {} async fn serve_asset(Path(path): Path<String>) {} # async { # axum::Server::bind(&"".parse().unwrap()).serve(app.into_make_service()).await.unwrap(); # };
Panics if the route overlaps with another route:
use axum::{routing::get, Router}; let app = Router::new() .route("/", get(|| async {})) .route("/", get(|| async {})); # async { # axum::Server::bind(&"".parse().unwrap()).serve(app.into_make_service()).await.unwrap(); # };
The static route /foo
and the dynamic route /:key
are not considered to overlap and /foo
will take precedence.
Also panics if path
is empty.