En Salvo, los datos de la solicitud del usuario se pueden obtener mediante Request
:
Request es una estructura que representa una solicitud HTTP, proporcionando funcionalidades completas para su manejo:
Se pueden obtener parámetros de consulta mediante get_query
:
Los datos de formulario se pueden obtener con get_form
, siendo esta una función asíncrona:
Request
proporciona varios métodos para analizar estos datos en estructuras fuertemente tipadas.
parse_params
: Analiza los parámetros de ruta del router como un tipo de dato específico;parse_queries
: Analiza las consultas URL como un tipo de dato específico;parse_headers
: Analiza las cabeceras HTTP como un tipo de dato específico;parse_json
: Interpreta los datos del cuerpo HTTP como JSON y los analiza en un tipo específico;parse_form
: Interpreta los datos del cuerpo HTTP como un formulario y los analiza en un tipo específico;parse_body
: Según el content-type
de la solicitud, analiza los datos del cuerpo HTTP como un tipo específico.extract
: Puede combinar diferentes fuentes de datos para analizarlas en un tipo específico.Aquí, mediante un serde::Deserializer
personalizado, se extraen datos como HashMap<String, String>
y HashMap<String, Vec<String>>
a tipos de datos específicos.
Por ejemplo: URL queries
se extrae como un tipo MultiMap, que puede considerarse similar a una estructura de datos como HashMap<String, Vec<String>>
. Si la URL solicitada es http://localhost/users?id=123&id=234
, y el tipo objetivo es:
Entonces, el primer id=123
se analizará, mientras que id=234
se descartará:
Si el tipo proporcionado es:
Entonces, tanto id=123
como id=234
se analizarán:
El framework incluye extractores de parámetros de solicitud. Estos extractores pueden simplificar significativamente el código para manejar solicitudes HTTP.
Para usar los extractores que necesitas, añade el feature "oapi"
en tu Cargo.toml
Luego puedes importar los extractores:
Extrae datos JSON del cuerpo de la solicitud y los deserializa en un tipo especificado.
Extrae datos de formulario del cuerpo de la solicitud y los deserializa en un tipo especificado.
Extrae un valor específico de las Cookies de la solicitud.
Extrae un valor específico de las cabeceras de la solicitud.
Extrae parámetros de la ruta URL.
Extrae parámetros de la cadena de consulta URL.
Puedes combinar múltiples fuentes de datos para analizarlas en un tipo específico. Primero define un tipo personalizado, por ejemplo:
Luego, en el Handler
, puedes obtener los datos así:
Incluso puedes pasar el tipo directamente como parámetro a la función, así:
La definición de tipos de datos es muy flexible, permitiendo incluso estructuras anidadas según sea necesario:
Para un ejemplo concreto, consulta: extract-nested.
#[salvo(extract(flatten))]
VS#[serde(flatten)]
Si en el ejemplo anterior Nested<'a> no tiene campos idénticos al padre, puedes usar #[serde(flatten)]
; de lo contrario, usa #[salvo(extract(flatten))]
.
#[salvo(extract(source(parse)))]
También puedes añadir un parámetro parse
a source
para especificar un método de análisis particular. Si no se especifica, el análisis se determinará según la información de Request
: si es un formulario, se analizará como MuiltMap
; si es un payload JSON, se analizará como JSON. Generalmente no es necesario especificar este parámetro, excepto en casos muy específicos donde puede habilitar funcionalidades especiales.
Por ejemplo, aquí la solicitud real es un Formulario, pero un campo específico contiene texto JSON. Al especificar parse
, este texto se analizará como JSON.
Categoría | Método | Descripción |
---|---|---|
Información de solicitud | uri()/uri_mut()/set_uri() | Operaciones con URI |
method()/method_mut() | Operaciones con método HTTP | |
version()/version_mut() | Operaciones con versión HTTP | |
scheme()/scheme_mut() | Operaciones con esquema de protocolo | |
remote_addr()/local_addr() | Información de direcciones | |
Cabeceras | headers()/headers_mut() | Obtiene todas las cabeceras |
header<T>()/try_header<T>() | Obtiene y analiza una cabecera específica | |
add_header() | Añade una cabecera | |
content_type()/accept() | Obtiene tipo de contenido/tipo aceptado | |
Manejo de parámetros | params()/param<T>() | Operaciones con parámetros de ruta |
queries()/query<T>() | Operaciones con parámetros de consulta | |
form<T>()/form_or_query<T>() | Operaciones con datos de formulario | |
Cuerpo de solicitud | body()/body_mut() | Obtiene el cuerpo de la solicitud |
replace_body()/take_body() | Modifica/extrae el cuerpo de la solicitud | |
payload()/payload_with_max_size() | Obtiene datos crudos | |
Manejo de archivos | file()/files()/all_files() | Obtiene archivos cargados |
first_file() | Obtiene el primer archivo | |
Análisis de datos | extract<T>() | Extracción unificada de datos |
parse_json<T>()/parse_form<T>() | Analiza JSON/formulario | |
parse_body<T>() | Analiza inteligentemente el cuerpo de la solicitud | |
parse_params<T>()/parse_queries<T>() | Analiza parámetros/consultas | |
Funcionalidades especiales | cookies()/cookie() | Operaciones con Cookies (requiere feature cookie) |
extensions()/extensions_mut() | Almacenamiento de datos de extensión | |
set_secure_max_size() | Establece límite de tamaño seguro |