Dans Salvo, les données de requête utilisateur peuvent être obtenues via Request
:
Request est une structure représentant une requête HTTP, offrant des fonctionnalités complètes de traitement des requêtes :
Les paramètres de requête peuvent être obtenus via get_query
:
Les données de formulaire peuvent être obtenues via get_form
, cette fonction est asynchrone :
Request
fournit plusieurs méthodes pour analyser ces données en structures fortement typées.
parse_params
: analyse les paramètres de route 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 du corps HTTP de la requête au format JSON en un type spécifique ;parse_form
: analyse les données du corps HTTP de la requête comme un formulaire en un type spécifique ;parse_body
: selon le type content-type
de la requête, analyse les données du corps HTTP en un type spécifique.extract
: peut combiner différentes sources de données pour analyser un type spécifique.Ici, un serde::Deserializer
personnalisé est utilisé pour extraire des données comme HashMap<String, String>
et HashMap<String, Vec<String>>
dans des types de données spécifiques.
Par exemple : URL queries
est en réalité extrait comme un type MultiMap, MultiMap
peut être considéré comme une structure de données similaire à HashMap<String, Vec<String>>
. Si l'URL de la requête est http://localhost/users?id=123&id=234
, et que le type cible fourni est :
Alors le premier id=123
sera analysé, id=234
sera ignoré :
Si le type fourni est :
Alors id=123&id=234
seront tous deux analysés :
Le framework intègre des extracteurs de paramètres de requête. Ces extracteurs peuvent grandement simplifier le code de traitement des requêtes HTTP.
Pour utiliser les extracteurs dont vous avez besoin, ajoutez la fonctionnalité "oapi"
dans votre Cargo.toml
Ensuite, vous pouvez importer les extracteurs :
Utilisé pour extraire les données JSON du corps de la requête et les désérialiser dans un type spécifié.
Extrait les données de formulaire du corps de la requête et les désérialise dans un type spécifié.
Extrait une valeur spécifique des cookies de la requête.
Extrait une valeur spécifique des en-têtes de la requête.
Extrait un paramètre du chemin URL.
Extrait un paramètre de la chaîne de requête URL.
Il est possible de combiner plusieurs sources de données pour analyser un type spécifique. Vous pouvez d'abord définir un type personnalisé, par exemple :
Ensuite, dans le Handler
, vous pouvez obtenir les données comme ceci :
Ou même passer directement le type comme paramètre à la fonction, comme ceci :
La définition des types de données est très flexible, permettant même une analyse en structures imbriquées selon les besoins :
Voir un exemple concret : extract-nested.
#[salvo(extract(flatten))]
VS#[serde(flatten)]
Si dans l'exemple ci-dessus Nested<'a> n'a pas les mêmes champs que le parent, vous pouvez utiliser #[serde(flatten)]
, sinon vous devez utiliser #[salvo(extract(flatten))]
.
#[salvo(extract(source(parse)))]
Il est également possible d'ajouter un paramètre parse
à source
pour spécifier un mode d'analyse particulier. Si ce paramètre n'est pas spécifié, l'analyse sera déterminée par les informations de la Request
. Si c'est un formulaire, il sera analysé comme MuiltMap
, si c'est une charge utile JSON, il sera analysé au format JSON. Généralement, ce paramètre n'a pas besoin d'être spécifié, mais dans de rares cas, il peut permettre 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. Dans ce cas, en spécifiant parse
, cette chaîne peut être analysée au format JSON.
Catégorie | Méthode | Description |
---|---|---|
Informations de requête | uri()/uri_mut()/set_uri() | Opérations sur l'URI |
method()/method_mut() | Opérations sur la méthode HTTP | |
version()/version_mut() | Opérations sur la version HTTP | |
scheme()/scheme_mut() | Opérations sur le schéma de protocole | |
remote_addr()/local_addr() | Informations d'adresse | |
En-têtes de requête | headers()/headers_mut() | Obtenir tous les en-têtes |
header<T>()/try_header<T>() | Obtenir et analyser un en-tête spécifique | |
add_header() | Ajouter un en-tête | |
content_type()/accept() | Obtenir le type de contenu/type accepté | |
Traitement des paramètres | params()/param<T>() | Opérations sur les paramètres de chemin |
queries()/query<T>() | Opérations sur les paramètres de requête | |
form<T>()/form_or_query<T>() | Opérations sur les données de formulaire | |
Corps de la requête | body()/body_mut() | Obtenir le corps de la requête |
replace_body()/take_body() | Modifier/extraire le corps de la requête | |
payload()/payload_with_max_size() | Obtenir les données brutes | |
Traitement des fichiers | file()/files()/all_files() | Obtenir les fichiers téléchargés |
first_file() | Obtenir le premier fichier | |
Analyse des données | extract<T>() | Extraction unifiée de données |
parse_json<T>()/parse_form<T>() | Analyser JSON/formulaire | |
parse_body<T>() | Analyse intelligente du corps de la requête | |
parse_params<T>()/parse_queries<T>() | Analyser les paramètres/requêtes | |
Fonctionnalités spéciales | cookies()/cookie() | Opérations sur les cookies (nécessite la fonctionnalité cookie) |
extensions()/extensions_mut() | Stockage de données d'extension | |
set_secure_max_size() | Définir une limite de taille sécurisée |