Requête
Dans Salvo, les données de requête utilisateur peuvent être obtenues via Request :
Aperçu rapide
Request est une structure représentant une requête HTTP, offrant des capacités complètes de traitement des requêtes :
- Opère sur les attributs de base (URI, méthode, version)
- Gère les en-têtes de requête et les Cookies
- Analyse divers paramètres (chemin, requête, formulaire)
- Prend en charge le traitement du corps de la requête et le téléchargement de fichiers
- Propose plusieurs méthodes d'analyse de données (JSON, formulaire, etc.)
- Implémente une extraction de données unifiée et typée de manière sûre via la méthode extract
Obtention des paramètres de requête
Les paramètres de requête peuvent être obtenus via get_query :
Obtention des données de formulaire
Les données de formulaire peuvent être obtenues via get_form. Cette fonction est asynchrone :
Obtention des données désérialisées JSON
Extraction des données de requête
Request fournit plusieurs méthodes pour analyser ces données en structures fortement typées.
parse_params: Analyse les paramètres de routeur de la requête en un type de données spécifique.parse_queries: Analyse les requêtes URL de la requête en un type de données spécifique.parse_headers: Analyse les en-têtes HTTP de la requête en un type de données spécifique.parse_json: Analyse les données dans la partie corps HTTP de la requête au format JSON en un type spécifique.parse_form: Analyse les données dans la partie corps HTTP de la requête en tant que Formulaire en un type spécifique.parse_body: Analyse les données dans la partie corps HTTP en un type spécifique en fonction ducontent-typede la requête.extract: Peut fusionner différentes sources de données pour analyser un type spécifique.
Principe d'analyse
Ici, un serde::Deserializer personnalisé est utilisé pour extraire des données de structures comme HashMap<String, String> et HashMap<String, Vec<String>> en types de données spécifiques.
Par exemple : Les requêtes URL sont en réalité extraites en tant que type MultiMap. MultiMap peut être considéré comme une structure de données similaire à HashMap<String, Vec<String>>. Si l'URL demandée est http://localhost/users?id=123&id=234, et que notre type cible est :
Alors le premier id=123 sera analysé, et id=234 sera ignoré :
Si le type que nous fournissons est :
Alors les deux id=123&id=234 seront analysés :
Extracteurs intégrés
Le framework inclut des extracteurs de paramètres de requête intégrés. Ces extracteurs peuvent considérablement simplifier le code pour gérer les requêtes HTTP.
Pour les utiliser, vous devez ajouter la fonctionnalité "oapi" dans votre Cargo.toml
Ensuite, vous pouvez importer les extracteurs :
JsonBody
Utilisé pour extraire les données JSON du corps de la requête et les désérialiser en un type spécifié.
FormBody
Extrait les données de formulaire du corps de la requête et les désérialise en un type spécifié.
CookieParam
Extrait une valeur spécifique des Cookies de la requête.
HeaderParam
Extrait une valeur spécifique des en-têtes de la requête.
PathParam
Extrait les paramètres du chemin URL.
QueryParam
Extrait les paramètres de la chaîne de requête URL.
Extraction depuis Depot
Vous pouvez extraire des données de Depot qui ont été injectées par un middleware. C'est utile pour accéder aux informations d'utilisateur authentifié ou à d'autres données de portée requête.
L'extraction de Depot prend en charge les types suivants :
Stringet&'static str- Entiers signés :
i8,i16,i32,i64,i128,isize - Entiers non signés :
u8,u16,u32,u64,u128,usize - Virgule flottante :
f32,f64 bool
Vous pouvez également mélanger depot avec d'autres sources :
Utilisation avancée
Vous pouvez fusionner plusieurs sources de données pour analyser un type spécifique. Tout d'abord, définissez un type personnalisé, par exemple :
Ensuite, dans un Handler, vous pouvez obtenir les données comme ceci :
Vous pouvez même passer le type directement en tant que paramètre de fonction, comme ceci :
Les définitions de types de données offrent une flexibilité considérable, permettant même l'analyse en structures imbriquées selon les besoins :
Pour un exemple concret, voir : extract-nested.
#[salvo(extract(flatten))] VS #[serde(flatten)]
Si dans l'exemple ci-dessus Nested<'a> n'a pas de champs portant les mêmes noms que le parent, vous pouvez utiliser #[serde(flatten)]. Sinon, vous devez utiliser #[salvo(extract(flatten))].
#[salvo(extract(source(parse)))]
Vous pouvez également ajouter un paramètre parse à source pour spécifier une méthode d'analyse particulière. Si ce paramètre n'est pas spécifié, l'analyse est déterminée en fonction des informations de la Request. Pour un corps Form, il est analysé en tant que MultiMap ; pour une charge utile JSON, il est analysé en JSON. Généralement, vous n'avez pas besoin de spécifier ce paramètre. Dans de rares cas, le spécifier peut activer des fonctionnalités spéciales.
Par exemple, ici la requête réelle envoie un Formulaire, mais la valeur d'un certain champ est un texte JSON. En spécifiant parse, cette chaîne peut être analysée au format JSON.