Solicitud
En Salvo, los datos de la solicitud del usuario se pueden obtener a través de Request:
Vista Rápida
Request es una estructura que representa una solicitud HTTP, proporcionando capacidades integrales de manejo de solicitudes:
- Opera sobre atributos básicos (URI, método, versión)
- Maneja encabezados de solicitud y Cookies
- Analiza varios parámetros (ruta, consulta, formulario)
- Soporta procesamiento del cuerpo de la solicitud y carga de archivos
- Ofrece múltiples métodos de análisis de datos (JSON, formulario, etc.)
- Implementa extracción de datos unificada y segura en tipos mediante el método extract
Obteniendo Parámetros de Consulta
Los parámetros de consulta se pueden obtener mediante get_query:
Obteniendo Datos de Formulario
Los datos de formulario se pueden obtener mediante get_form. Esta función es asíncrona:
Obteniendo Datos Deserializados en JSON
Extrayendo Datos de la Solicitud
Request proporciona múltiples métodos para analizar estos datos en estructuras fuertemente tipadas.
parse_params: Analiza los parámetros de ruta de la solicitud en un tipo de dato específico.parse_queries: Analiza las consultas de URL de la solicitud en un tipo de dato específico.parse_headers: Analiza los encabezados HTTP de la solicitud en un tipo de dato específico.parse_json: Analiza los datos en la parte del cuerpo HTTP de la solicitud en formato JSON a un tipo específico.parse_form: Analiza los datos en la parte del cuerpo HTTP de la solicitud como un Formulario a un tipo específico.parse_body: Analiza los datos en la parte del cuerpo HTTP a un tipo específico basado en elcontent-typede la solicitud.extract: Puede combinar diferentes fuentes de datos para analizar un tipo específico.
Principio de Análisis
Aquí se utiliza un serde::Deserializer personalizado para extraer datos de estructuras como HashMap<String, String> y HashMap<String, Vec<String>> a tipos de datos específicos.
Por ejemplo: las consultas de URL se extraen realmente como un tipo MultiMap. MultiMap puede considerarse como una estructura de datos similar a HashMap<String, Vec<String>>. Si la URL solicitada es http://localhost/users?id=123&id=234, y nuestro tipo objetivo es:
Entonces se analizará el primer id=123, y id=234 será descartado:
Si el tipo que proporcionamos es:
Entonces se analizarán ambos id=123&id=234:
Extractores Integrados
El framework incluye extractores de parámetros de solicitud integrados. Estos extractores pueden simplificar significativamente el código para manejar solicitudes HTTP.
Para usarlos, necesitas agregar la característica "oapi" en tu Cargo.toml
Luego puedes importar los extractores:
JsonBody
Se utiliza para extraer datos JSON del cuerpo de la solicitud y deserializarlos en un tipo especificado.
FormBody
Extrae datos de formulario del cuerpo de la solicitud y los deserializa en un tipo especificado.
CookieParam
Extrae un valor específico de las Cookies de la solicitud.
HeaderParam
Extrae un valor específico de los encabezados de la solicitud.
PathParam
Extrae parámetros de la ruta de la URL.
QueryParam
Extrae parámetros de la cadena de consulta de la URL.
Extracción desde Depot
Puedes extraer datos de Depot que fueron inyectados por middleware. Esto es útil para acceder a información de usuario autenticado u otros datos del ámbito de la solicitud.
La extracción de Depot soporta los siguientes tipos:
Stringy&'static str- Enteros con signo:
i8,i16,i32,i64,i128,isize - Enteros sin signo:
u8,u16,u32,u64,u128,usize - Punto flotante:
f32,f64 bool
También puedes mezclar depot con otras fuentes:
Uso Avanzado
Puedes combinar múltiples fuentes de datos para analizar un tipo específico. Primero, define un tipo personalizado, por ejemplo:
Luego, en un Handler, puedes obtener los datos así:
Incluso puedes pasar el tipo directamente como parámetro de función, así:
Las definiciones de tipos de datos ofrecen una flexibilidad considerable, incluso permitiendo analizar en estructuras anidadas según sea necesario:
Para un ejemplo concreto, ver: extract-nested.
#[salvo(extract(flatten))] VS #[serde(flatten)]
Si en el ejemplo anterior Nested<'a> no tiene campos con los mismos nombres que el padre, puedes usar #[serde(flatten)]. De lo contrario, necesitas usar #[salvo(extract(flatten))].
#[salvo(extract(source(parse)))]
También puedes agregar un parámetro parse a source para especificar un método de análisis particular. Si este parámetro no se especifica, el análisis se determina basado en la información de la Request. Para un cuerpo Form, se analiza como MultiMap; para una carga útil JSON, se analiza como JSON. Generalmente, no necesitas especificar este parámetro. En casos raros, especificarlo puede habilitar funcionalidades especiales.
Por ejemplo, aquí la solicitud real envía un Formulario, pero el valor de cierto campo es un texto JSON. Al especificar parse, esta cadena se puede analizar en formato JSON.