pub struct Path<T>(pub T);Expand description
Extractor that will get captures from the URL and parse them using
serde.
Any percent encoded parameters will be automatically decoded. The decoded
parameters must be valid UTF-8, otherwise Path will fail and return a 400 Bad Request response.
§Example
These examples assume the serde feature of the uuid crate is enabled.
One Path can extract multiple captures. It is not necessary (and does
not work) to give a handler more than one Path argument.
use axum::{
extract::Path,
routing::get,
Router,
};
use uuid::Uuid;
async fn users_teams_show(
Path((user_id, team_id)): Path<(Uuid, Uuid)>,
) {
// ...
}
let app = Router::new().route("/users/:user_id/team/:team_id", get(users_teams_show));If the path contains only one parameter, then you can omit the tuple.
use axum::{
extract::Path,
routing::get,
Router,
};
use uuid::Uuid;
async fn user_info(Path(user_id): Path<Uuid>) {
// ...
}
let app = Router::new().route("/users/:user_id", get(user_info));Path segments also can be deserialized into any type that implements
serde::Deserialize. This includes tuples and structs:
use axum::{
extract::Path,
routing::get,
Router,
};
use serde::Deserialize;
use uuid::Uuid;
// Path segment labels will be matched with struct field names
#[derive(Deserialize)]
struct Params {
user_id: Uuid,
team_id: Uuid,
}
async fn users_teams_show(
Path(Params { user_id, team_id }): Path<Params>,
) {
// ...
}
// When using tuples the path segments will be matched by their position in the route
async fn users_teams_create(
Path((user_id, team_id)): Path<(String, String)>,
) {
// ...
}
let app = Router::new().route(
"/users/:user_id/team/:team_id",
get(users_teams_show).post(users_teams_create),
);If you wish to capture all path parameters you can use HashMap or Vec:
use axum::{
extract::Path,
routing::get,
Router,
};
use std::collections::HashMap;
async fn params_map(
Path(params): Path<HashMap<String, String>>,
) {
// ...
}
async fn params_vec(
Path(params): Path<Vec<(String, String)>>,
) {
// ...
}
let app = Router::new()
.route("/users/:user_id/team/:team_id", get(params_map).post(params_vec));§Providing detailed rejection output
If the URI cannot be deserialized into the target type the request will be rejected and an
error response will be returned. See customize-path-rejection for an example of how to customize that error.
Tuple Fields§
§0: TTrait Implementations§
Source§impl<T, S> FromRequestParts<S> for Path<T>
impl<T, S> FromRequestParts<S> for Path<T>
Source§type Rejection = PathRejection
type Rejection = PathRejection
Source§fn from_request_parts<'life0, 'life1, 'async_trait>(
parts: &'life0 mut Parts,
_state: &'life1 S,
) -> Pin<Box<dyn Future<Output = Result<Path<T>, <Path<T> as FromRequestParts<S>>::Rejection>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Path<T>: 'async_trait,
fn from_request_parts<'life0, 'life1, 'async_trait>(
parts: &'life0 mut Parts,
_state: &'life1 S,
) -> Pin<Box<dyn Future<Output = Result<Path<T>, <Path<T> as FromRequestParts<S>>::Rejection>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Path<T>: 'async_trait,
Source§impl<T1, T2> ParameterProvider for Path<(T1, T2)>
impl<T1, T2> ParameterProvider for Path<(T1, T2)>
Auto Trait Implementations§
impl<T> Freeze for Path<T>where
T: Freeze,
impl<T> RefUnwindSafe for Path<T>where
T: RefUnwindSafe,
impl<T> Send for Path<T>where
T: Send,
impl<T> Sync for Path<T>where
T: Sync,
impl<T> Unpin for Path<T>where
T: Unpin,
impl<T> UnwindSafe for Path<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<S, T> FromRequest<S, ViaParts> for T
impl<S, T> FromRequest<S, ViaParts> for T
Source§type Rejection = <T as FromRequestParts<S>>::Rejection
type Rejection = <T as FromRequestParts<S>>::Rejection
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more