В Salvo данные пользовательского запроса можно получить через структуру Request
:
Request — это структура, представляющая HTTP-запрос, предоставляющая полный набор функций для обработки запросов:
Параметры запроса можно получить через get_query
:
Данные формы можно получить через get_form
, эта функция асинхронная:
Request
предоставляет несколько методов для разбора этих данных в строго типизированные структуры.
parse_params
: разбирает параметры маршрута запроса в указанный тип данных;parse_queries
: разбирает параметры URL-запроса в указанный тип данных;parse_headers
: разбирает HTTP-заголовки запроса в указанный тип данных;parse_json
: разбирает данные тела HTTP-запроса как JSON в указанный тип;parse_form
: разбирает данные тела HTTP-запроса как форму в указанный тип;parse_body
: в зависимости от content-type
запроса, разбирает данные тела HTTP-запроса в указанный тип;extract
: может объединять различные источники данных для разбора в указанный тип.Здесь используется пользовательский serde::Deserializer
для извлечения данных из структур типа HashMap<String, String>
и HashMap<String, Vec<String>>
в указанные типы данных.
Например: URL queries
фактически извлекаются как тип MultiMap, который можно рассматривать как структуру данных, аналогичную HashMap<String, Vec<String>>
. Если запрошенный URL — http://localhost/users?id=123&id=234
, а целевой тип:
то первый id=123
будет разобран, а id=234
— отброшен:
Если же указан тип:
то оба id=123&id=234
будут разобраны:
Фреймворк включает встроенные экстракторы параметров запроса. Эти экстракторы могут значительно упростить код обработки HTTP-запросов.
Для использования необходимо добавить экстрактор "oapi" feature
в ваш Cargo.toml
Затем можно импортировать экстракторы:
Используется для извлечения JSON-данных из тела запроса и десериализации в указанный тип.
Извлекает данные формы из тела запроса и десериализует в указанный тип.
Извлекает определенное значение из Cookie запроса.
Извлекает определенное значение из заголовка запроса.
Извлекает параметр из пути URL.
Извлекает параметр из строки запроса URL.
Можно объединять несколько источников данных для разбора в определенный тип. Сначала определите пользовательский тип, например:
Затем в Handler
можно получить данные так:
Или даже напрямую передать тип как параметр функции:
Определение типов данных обладает значительной гибкостью, позволяя разбирать даже вложенные структуры:
Конкретный пример см.: extract-nested.
#[salvo(extract(flatten))]
VS#[serde(flatten)]
Если в приведенном примере Nested<'a> не имеет полей, совпадающих с родительскими, можно использовать #[serde(flatten)]
, в противном случае необходимо использовать #[salvo(extract(flatten))]
.
#[salvo(extract(source(parse)))]
Фактически, можно также добавить параметр parse
к source
для указания конкретного способа разбора. Если этот параметр не указан, разбор будет выполняться на основе информации из Request
: для формы Form — как MuiltMap, для JSON-полезной нагрузки — как JSON. Обычно этот параметр указывать не нужно, но в редких случаях он может реализовать специальные функции.
Например, если фактически запрос отправляет Form, но значение некоторого поля — это текст в формате JSON, можно указать parse
, чтобы разобрать эту строку как JSON.
Категория | Метод | Описание |
---|---|---|
Информация о запросе | uri()/uri_mut()/set_uri() | Операции с URI |
method()/method_mut() | Операции с HTTP-методом | |
version()/version_mut() | Операции с версией HTTP | |
scheme()/scheme_mut() | Операции с протоколом | |
remote_addr()/local_addr() | Информация об адресе | |
Заголовки запроса | headers()/headers_mut() | Получение всех заголовков |
header<T>()/try_header<T>() | Получение и разбор конкретного заголовка | |
add_header() | Добавление заголовка | |
content_type()/accept() | Получение типа контента/принимаемого типа | |
Обработка параметров | params()/param<T>() | Операции с параметрами пути |
queries()/query<T>() | Операции с параметрами запроса | |
form<T>()/form_or_query<T>() | Операции с данными формы | |
Тело запроса | body()/body_mut() | Получение тела запроса |
replace_body()/take_body() | Изменение/извлечение тела запроса | |
payload()/payload_with_max_size() | Получение сырых данных | |
Обработка файлов | file()/files()/all_files() | Получение загруженных файлов |
first_file() | Получение первого файла | |
Разбор данных | extract<T>() | Единое извлечение данных |
parse_json<T>()/parse_form<T>() | Разбор JSON/формы | |
parse_body<T>() | Интеллектуальный разбор тела запроса | |
parse_params<T>()/parse_queries<T>() | Разбор параметров/запроса | |
Специальные функции | cookies()/cookie() | Операции с Cookie (требуется cookie feature) |
extensions()/extensions_mut() | Хранение расширенных данных | |
set_secure_max_size() | Установка ограничения безопасного размера | |
{/* 本行由工具自动生成,原文哈希值:6b654f79df08ba1dc5cc1c070780def0 */} |