Extracteurs de paramètres
Path — Paramètres d'URL
Valeur typée — request.get_path_as()
Parse le segment d'URL directement dans le type cible.
Retourne None si la clé est absente ou si la valeur ne peut pas être parsée.
// Route : "/menus/{id}"
async fn menu_detail(mut request: Request) -> AppResult<Response> {
let Some(id) = request.get_path_as::<i32>("id") else {
return Ok((StatusCode::NOT_FOUND, "Introuvable").into_response());
};
// id = 42 pour /menus/42
}
Chaîne brute — request.get_path()
async fn article(mut request: Request) -> AppResult<Response> {
let slug = request.get_path("slug").unwrap_or_default();
}
Plusieurs segments — extracteur Axum Path
Pour extraire plusieurs segments à la fois, l'extracteur Axum reste disponible :
use axum::extract::Path;
#[derive(Deserialize)]
pub struct UserPostPath {
user_id: i32,
post_id: i32,
}
async fn user_post(
Path(params): Path<UserPostPath>,
mut request: Request,
) -> AppResult<Response> {
// params.user_id, params.post_id
}
Query — Paramètres de requête
Struct typée — request.query()
Désérialise la query string complète vers une struct dérivant Deserialize + Default.
Les clés inconnues sont ignorées ; les clés absentes prennent leur valeur Default.
#[derive(Deserialize, Default)]
pub struct Filtres {
page: Option<u32>,
limit: Option<u32>,
recherche: Option<String>,
}
async fn liste(mut request: Request) -> AppResult<Response> {
let filtres: Filtres = request.query();
let page = filtres.page.unwrap_or(1);
// ...
}
Valeur unique — request.get_query(clé)
async fn liste(mut request: Request) -> AppResult<Response> {
let page: u32 = request.get_query("page")
.and_then(|v| v.parse().ok())
.unwrap_or(1);
// ...
}
Headers — `request.headers`
La map HTTP complète des en-têtes est accessible directement sur Request. Utile pour lire Host, Accept-Language, des en-têtes custom, etc.
async fn handler(mut request: Request) -> AppResult<Response> {
// Construire une URL absolue depuis le header Host
let base_url = request.headers
.get("host")
.and_then(|v| v.to_str().ok())
.map(|h| format!("https://{h}"))
.unwrap_or_else(|| "http://localhost:3000".to_string());
// Lire n'importe quel header
let lang = request.headers
.get("accept-language")
.and_then(|v| v.to_str().ok())
.unwrap_or("fr");
}
request.headers est de type axum::http::HeaderMap, re-exporté dans le prelude.
Base de données — `request.db()`
Retourne une &DatabaseConnection depuis le moteur, prête à passer aux requêtes SeaORM.
async fn handler(mut request: Request) -> AppResult<Response> {
let db = request.db();
let item = MyEntity::find_by_id(1).one(db).await?;
// ...
}
Équivalent à &*request.engine.db, en plus court et lisible.
Formulaires — `req.form()`
use runique::prelude::*;
async fn inscription(mut request: Request) -> AppResult<Response> {
let mut form: RegisterForm = request.form();
if form.is_valid().await {
form.save(&request.engine.db).await?;
}
// ...
}
Json — Corps JSON
use axum::Json;
#[derive(Deserialize)]
pub struct CreateUserRequest {
username: String,
email: String,
}
async fn create_api(
Json(payload): Json<CreateUserRequest>,
) -> impl IntoResponse {
// payload.username, payload.email
}