Pedido
No Salvo, os dados de pedido do utilizador podem ser obtidos através de Request:
Visão Geral Rápida
Request é uma estrutura que representa um pedido HTTP, fornecendo capacidades abrangentes de processamento de pedidos:
- Opera em atributos básicos (URI, método, versão)
- Processa cabeçalhos de pedido e Cookies
- Analisa vários parâmetros (caminho, consulta, formulário)
- Suporta processamento do corpo do pedido e uploads de ficheiros
- Oferece múltiplos métodos de análise de dados (JSON, formulário, etc.)
- Implementa extração de dados unificada e segura em tipos através do método extract
Obter Parâmetros de Consulta
Os parâmetros de consulta podem ser obtidos via get_query:
Obter Dados de Formulário
Os dados de formulário podem ser obtidos via get_form. Esta função é assíncrona:
Obter Dados Desserializados JSON
Extrair Dados do Pedido
Request fornece múltiplos métodos para analisar estes dados em estruturas fortemente tipadas.
parse_params: Analisa os parâmetros de roteamento do pedido num tipo de dados específico.parse_queries: Analisa as consultas URL do pedido num tipo de dados específico.parse_headers: Analisa os cabeçalhos HTTP do pedido num tipo de dados específico.parse_json: Analisa os dados na parte do corpo HTTP do pedido no formato JSON para um tipo específico.parse_form: Analisa os dados na parte do corpo HTTP do pedido como um Formulário para um tipo específico.parse_body: Analisa os dados na parte do corpo HTTP para um tipo específico com base nocontent-typedo pedido.extract: Pode combinar diferentes fontes de dados para analisar um tipo específico.
Princípio de Análise
Aqui, é usado um serde::Deserializer personalizado para extrair dados de estruturas como HashMap<String, String> e HashMap<String, Vec<String>> para tipos de dados específicos.
Por exemplo: Consultas URL são na verdade extraídas como um tipo MultiMap. MultiMap pode ser pensado como uma estrutura de dados semelhante a HashMap<String, Vec<String>>. Se o URL solicitado for http://localhost/users?id=123&id=234, e o nosso tipo alvo for:
Então o primeiro id=123 será analisado, e id=234 será descartado:
Se o tipo que fornecemos for:
Então ambos id=123&id=234 serão analisados:
Extratores Integrados
O framework inclui extratores de parâmetros de pedido integrados. Estes extratores podem simplificar significativamente o código para lidar com pedidos HTTP.
Para usá-los, precisa adicionar a funcionalidade "oapi" no seu Cargo.toml
Depois pode importar os extratores:
JsonBody
Usado para extrair dados JSON do corpo do pedido e desserializá-los num tipo especificado.
FormBody
Extrai dados de formulário do corpo do pedido e desserializa-os num tipo especificado.
CookieParam
Extrai um valor específico dos Cookies do pedido.
HeaderParam
Extrai um valor específico dos cabeçalhos do pedido.
PathParam
Extrai parâmetros do caminho URL.
QueryParam
Extrai parâmetros da string de consulta URL.
Extração do Depot
Pode extrair dados do Depot que foram injetados por middleware. Isto é útil para aceder a informações de utilizador autenticado ou outros dados do âmbito do pedido.
A extração do Depot suporta os seguintes tipos:
Stringe&'static str- Inteiros com sinal:
i8,i16,i32,i64,i128,isize - Inteiros sem sinal:
u8,u16,u32,u64,u128,usize - Vírgula flutuante:
f32,f64 bool
Também pode misturar depot com outras fontes:
Uso Avançado
Pode combinar múltiplas fontes de dados para analisar um tipo específico. Primeiro, defina um tipo personalizado, por exemplo:
Depois num Handler, pode obter os dados assim:
Pode até passar o tipo diretamente como um parâmetro de função, assim:
As definições de tipo de dados oferecem flexibilidade considerável, permitindo até analisar em estruturas aninhadas conforme necessário:
Para um exemplo concreto, veja: extract-nested.
#[salvo(extract(flatten))] VS #[serde(flatten)]
Se no exemplo acima Nested<'a> não tiver campos com os mesmos nomes que o pai, pode usar #[serde(flatten)]. Caso contrário, precisa usar #[salvo(extract(flatten))].
#[salvo(extract(source(parse)))]
Também pode adicionar um parâmetro parse ao source para especificar um método de análise particular. Se este parâmetro não for especificado, a análise é determinada com base na informação do Request. Para um corpo Form, é analisado como MultiMap; para uma carga útil JSON, é analisado como JSON. Geralmente, não precisa especificar este parâmetro. Em casos raros, especificá-lo pode permitir funcionalidade especial.
Por exemplo, aqui o pedido real envia um Formulário, mas o valor de um certo campo é um pedaço de texto JSON. Ao especificar parse, esta string pode ser analisada no formato JSON.