Request
In Salvo, i dati della richiesta dell'utente possono essere ottenuti tramite Request:
Panoramica Rapida
Request è una struttura che rappresenta una richiesta HTTP, fornendo capacità complete di gestione delle richieste:
- Opera sugli attributi di base (URI, metodo, versione)
- Gestisce gli header della richiesta e i Cookie
- Analizza vari parametri (percorso, query, form)
- Supporta l'elaborazione del corpo della richiesta e il caricamento di file
- Offre molteplici metodi di analisi dei dati (JSON, form, ecc.)
- Implementa l'estrazione di dati unificata e type-safe tramite il metodo extract
Ottenere i Parametri della Query
I parametri della query possono essere ottenuti tramite get_query:
Ottenere i Dati del Form
I dati del form possono essere ottenuti tramite get_form. Questa funzione è asincrona:
Ottenere Dati Deserializzati JSON
Estrazione dei Dati della Richiesta
Request fornisce molteplici metodi per analizzare questi dati in strutture fortemente tipizzate.
parse_params: Analizza i parametri del router della richiesta in un tipo di dato specifico.parse_queries: Analizza le query dell'URL della richiesta in un tipo di dato specifico.parse_headers: Analizza gli header HTTP della richiesta in un tipo di dato specifico.parse_json: Analizza i dati nella parte del corpo HTTP della richiesta in formato JSON in un tipo specifico.parse_form: Analizza i dati nella parte del corpo HTTP della richiesta come Form in un tipo specifico.parse_body: Analizza i dati nella parte del corpo HTTP in un tipo specifico basandosi sulcontent-typedella richiesta.extract: Può unire diverse fonti di dati per analizzare un tipo specifico.
Principio di Analisi
Qui viene utilizzato un serde::Deserializer personalizzato per estrarre dati da strutture come HashMap<String, String> e HashMap<String, Vec<String>> in tipi di dati specifici.
Ad esempio: le query URL sono effettivamente estratte come un tipo MultiMap. MultiMap può essere pensata come una struttura dati simile a HashMap<String, Vec<String>>. Se l'URL richiesto è http://localhost/users?id=123&id=234, e il nostro tipo target è:
Allora il primo id=123 verrà analizzato, e id=234 verrà scartato:
Se il tipo che forniamo è:
Allora entrambi id=123&id=234 verranno analizzati:
Estrattori Integrati
Il framework include estrattori integrati per i parametri della richiesta. Questi estrattori possono semplificare notevolmente il codice per gestire le richieste HTTP.
Per utilizzarli, è necessario aggiungere la feature "oapi" nel tuo Cargo.toml
Poi puoi importare gli estrattori:
JsonBody
Utilizzato per estrarre dati JSON dal corpo della richiesta e deserializzarli in un tipo specificato.
FormBody
Estrae i dati del form dal corpo della richiesta e li deserializza in un tipo specificato.
CookieParam
Estrae un valore specifico dai Cookie della richiesta.
HeaderParam
Estrae un valore specifico dagli header della richiesta.
PathParam
Estrae i parametri dal percorso dell'URL.
QueryParam
Estrae i parametri dalla stringa di query dell'URL.
Estrazione da Depot
Puoi estrarre dati da Depot che sono stati iniettati da middleware. Questo è utile per accedere alle informazioni dell'utente autenticato o ad altri dati nell'ambito della richiesta.
L'estrazione da Depot supporta i seguenti tipi:
Stringe&'static str- Interi con segno:
i8,i16,i32,i64,i128,isize - Interi senza segno:
u8,u16,u32,u64,u128,usize - Virgola mobile:
f32,f64 bool
Puoi anche combinare depot con altre fonti:
Utilizzo Avanzato
Puoi unire più fonti di dati per analizzare un tipo specifico. Per prima cosa, definisci un tipo personalizzato, ad esempio:
Poi in un Handler, puoi ottenere i dati in questo modo:
Puoi persino passare il tipo direttamente come parametro di funzione, in questo modo:
Le definizioni dei tipi di dati offrono una notevole flessibilità, permettendo persino di analizzare in strutture annidate secondo necessità:
Per un esempio concreto, vedi: extract-nested.
#[salvo(extract(flatten))] VS #[serde(flatten)]
Se nell'esempio sopra Nested<'a> non ha campi con gli stessi nomi del genitore, puoi usare #[serde(flatten)]. Altrimenti, devi usare #[salvo(extract(flatten))].
#[salvo(extract(source(parse)))]
Puoi anche aggiungere un parametro parse a source per specificare un particolare metodo di analisi. Se questo parametro non è specificato, l'analisi è determinata in base alle informazioni della Request. Per un corpo Form, viene analizzato come MultiMap; per un payload JSON, viene analizzato come JSON. Generalmente, non è necessario specificare questo parametro. In rari casi, specificarlo può abilitare funzionalità speciali.
Ad esempio, qui la richiesta effettiva invia un Form, ma il valore di un certo campo è un pezzo di testo JSON. Specificando parse, questa stringa può essere analizzata in formato JSON.