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.
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: T
Trait 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,
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<T, A> DynAccess<T> for A
impl<T, A> DynAccess<T> for A
Source§fn load(&self) -> DynGuard<T>
fn load(&self) -> DynGuard<T>
Access::load
.Source§impl<S, B, T> FromRequest<S, B, ViaParts> for T
impl<S, B, T> FromRequest<S, B, 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