Anfrage
In Salvo können Benutzeranfragedaten über Request abgerufen werden:
Schnellübersicht
Request ist eine Struktur, die eine HTTP-Anfrage repräsentiert und umfassende Anfrageverarbeitungsfähigkeiten bietet:
- Operationen auf grundlegenden Attributen (URI, Methode, Version)
- Verarbeitung von Anfrage-Headern und Cookies
- Parsen verschiedener Parameter (Pfad, Query, Formular)
- Unterstützung der Anfragekörperverarbeitung und Datei-Uploads
- Bietet mehrere Datenparsermethoden (JSON, Formular usw.)
- Implementiert einheitliche typsichere Datenextraktion über die extract-Methode
Abrufen von Query-Parametern
Query-Parameter können über get_query abgerufen werden:
Abrufen von Formulardaten
Formulardaten können über get_form abgerufen werden. Diese Funktion ist asynchron:
Abrufen von JSON-deserialisierten Daten
Extrahieren von Anfragedaten
Request bietet mehrere Methoden, um diese Daten in stark typisierte Strukturen zu parsen.
parse_params: Parst die Router-Parameter der Anfrage in einen bestimmten Datentyp.parse_queries: Parst die URL-Queries der Anfrage in einen bestimmten Datentyp.parse_headers: Parst die HTTP-Header der Anfrage in einen bestimmten Datentyp.parse_json: Parst die Daten im HTTP-Körperteil der Anfrage als JSON-Format in einen bestimmten Typ.parse_form: Parst die Daten im HTTP-Körperteil der Anfrage als Formular in einen bestimmten Typ.parse_body: Parst die Daten im HTTP-Körperteil basierend auf demcontent-typeder Anfrage in einen bestimmten Typ.extract: Kann verschiedene Datenquellen zusammenführen, um einen bestimmten Typ zu parsen.
Parsing-Prinzip
Hier wird ein benutzerdefinierter serde::Deserializer verwendet, um Daten aus Strukturen wie HashMap<String, String> und HashMap<String, Vec<String>> in bestimmte Datentypen zu extrahieren.
Beispiel: URL-Queries werden tatsächlich als MultiMap-Typ extrahiert. MultiMap kann als eine Datenstruktur ähnlich HashMap<String, Vec<String>> betrachtet werden. Wenn die angeforderte URL http://localhost/users?id=123&id=234 ist und unser Zieltyp:
Dann wird das erste id=123 geparst und id=234 verworfen:
Wenn unser bereitgestellter Typ:
Dann werden beide id=123&id=234 geparst:
Integrierte Extractor
Das Framework enthält integrierte Anfrageparameter-Extractor. Diese Extractor können den Code für die Behandlung von HTTP-Anfragen erheblich vereinfachen.
Um sie zu verwenden, müssen Sie das "oapi"-Feature in Ihrer Cargo.toml hinzufügen
Dann können Sie die Extractor importieren:
JsonBody
Wird verwendet, um JSON-Daten aus dem Anfragekörper zu extrahieren und in einen angegebenen Typ zu deserialisieren.
FormBody
Extrahiert Formulardaten aus dem Anfragekörper und deserialisiert sie in einen angegebenen Typ.
CookieParam
Extrahiert einen bestimmten Wert aus den Cookies der Anfrage.
HeaderParam
Extrahiert einen bestimmten Wert aus den Anfrage-Headern.
PathParam
Extrahiert Parameter aus dem URL-Pfad.
QueryParam
Extrahiert Parameter aus der URL-Query-Zeichenkette.
Extraktion aus Depot
Sie können Daten aus Depot extrahieren, die von Middleware eingefügt wurden. Dies ist nützlich für den Zugriff auf authentifizierte Benutzerinformationen oder andere anfragebezogene Daten.
Depot-Extraktion unterstützt folgende Typen:
Stringund&'static str- Vorzeichenbehaftete Ganzzahlen:
i8,i16,i32,i64,i128,isize - Vorzeichenlose Ganzzahlen:
u8,u16,u32,u64,u128,usize - Gleitkommazahlen:
f32,f64 bool
Sie können depot auch mit anderen Quellen kombinieren:
Erweiterte Verwendung
Sie können mehrere Datenquellen zusammenführen, um einen bestimmten Typ zu parsen. Definieren Sie zunächst einen benutzerdefinierten Typ, zum Beispiel:
Dann können Sie in einem Handler die Daten wie folgt abrufen:
Sie können den Typ sogar direkt als Funktionsparameter übergeben, wie hier:
Datentypdefinitionen bieten beträchtliche Flexibilität und erlauben sogar das Parsen in verschachtelte Strukturen nach Bedarf:
Ein konkretes Beispiel finden Sie unter: extract-nested.
#[salvo(extract(flatten))] VS #[serde(flatten)]
Wenn im obigen Beispiel Nested<'a> keine Felder mit denselben Namen wie das Elternobjekt hat, können Sie #[serde(flatten)] verwenden. Andernfalls müssen Sie #[salvo(extract(flatten))] verwenden.
#[salvo(extract(source(parse)))]
Sie können auch einen parse-Parameter zu source hinzufügen, um eine bestimmte Parsing-Methode anzugeben. Wenn dieser Parameter nicht angegeben ist, wird das Parsing basierend auf den Request-Informationen bestimmt. Für einen Form-Körper wird es als MultiMap geparst; für eine JSON-Nutzlast wird es als JSON geparst. Im Allgemeinen müssen Sie diesen Parameter nicht angeben. In seltenen Fällen kann die Angabe spezielle Funktionen ermöglichen.
Beispielsweise sendet hier die tatsächliche Anfrage ein Formular, aber der Wert eines bestimmten Feldes ist ein JSON-Textstück. Durch Angabe von parse kann diese Zeichenkette im JSON-Format geparst werden.