Волга
Главная
Agent Skill
API Docs
GitHub
  • English
  • Русский
Главная
Agent Skill
API Docs
GitHub
  • English
  • Русский
  • Главная
  • Старт

    • Быстрый старт
    • Обработчики
    • Параметры маршрута
    • Параметры запроса
    • Группировка маршрутов
  • Запросы и ответы

    • Заголовки (Headers)
    • Работа с JSON
    • Работа с Form Data
    • Работа с файлами
    • Multipart-ответы
    • Сырое тело запроса
    • Cookies
    • Валидация запросов
  • Middleware и инфраструктура

    • Основы Middleware
    • Пользовательские Middleware
    • Параметризованные Middleware
    • Сжатие ответов
    • Распаковка запросов
    • CORS (Cross-Origin Resource Sharing)
    • Статические файлы
    • Rate Limiting
    • Файлы конфигурации
    • OpenAPI
  • Безопасность и доступ

    • Аутентификация и авторизация
    • OAuth 2.1 и OpenID Connect
    • OAuth 2.1 Клиент
    • Гранты «сервис-сервис»
    • DPoP — токены, привязанные к отправителю
  • Надежность и наблюдаемость

    • Центральный обработчик ошибок
    • Логгирование и Трассировка
    • Отмена запросов
    • Плавное завершение работы
  • Протоколы и realtime

    • Версии и методы HTTP
    • HTTPS
    • WebSockets
    • Server-Sent Events (SSE)
  • Продвинутые паттерны

    • Внедрение Зависимостей
    • Пользовательская обработка методов HEAD, OPTIONS и TRACE
  • Agent Skill

Версии и методы HTTP

HTTP/1 и HTTP/2

Начиная с v0.3.1, можно настроить версию HTTP. Если добавить Волгу вот так, по умолчанию используется HTTP/1:

[dependencies]
volga = { version = "..." }

Чтобы включить HTTP/2, добавьте функцию http2 или используйте full:

[dependencies]
volga = { version = "...", features = ["full"] }

При использовании full HTTP/2 применяется, если это возможно, иначе автоматически используется HTTP/1.

HTTP-методы

Для каждого стандартного глагола в Волге есть именованный метод map_* — он регистрируется на App или на RouteGroup:

app.map_get("/items", || async { ok!("list") });
app.map_post("/items", || async { ok!("created") });
app.map_put("/items/{id}", || async { ok!("updated") });
app.map_patch("/items/{id}", || async { ok!("patched") });
app.map_delete("/items/{id}", || async { ok!("deleted") });
app.map_head("/items", || async { ok!() });
app.map_options("/items", || async { ok!() });
app.map_trace("/items", || async { ok!() });

Совет

Запрос HEAD, у которого нет собственного маршрута, обрабатывается маршрутом GET для того же пути — через middleware и политику CORS этого маршрута, — поэтому map_head нужен только для собственной реализации. См. Свои обработчики HEAD, OPTIONS и TRACE.

Метод QUERY

Начиная с v0.9.4, Волга поддерживает HTTP-метод QUERY — безопасный идемпотентный глагол с телом запроса, для поисковых запросов, которые слишком велики или слишком структурированы для строки запроса URI.

Обработчик регистрируется через map_query():

use volga::{App, Json, ok};
use serde::Deserialize;

#[derive(Deserialize)]
struct SearchQuery {
    criteria: String
}

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let mut app = App::new();

    app.map_query("/search", |query: Json<SearchQuery>| async move {
        // выполняем поиск по query.criteria...
        ok!("search results...")
    });

    app.run().await
}

Проверить можно через curl:

> curl -X QUERY "http://localhost:7878/search" -H "Content-Type: application/json" -d '{"criteria":"volga"}'

Примечание

Не путайте map_query() с экстрактором Query<T>: первый регистрирует маршрут для глагола QUERY, второй читает строку запроса URI любого запроса.

Совет

Сложные критерии выборки лучше передавать в теле запроса QUERY. Параметры строки запроса стоит оставить для метаданных, влияющих на маршрутизацию и кеширование: тенант, локаль, версия, флаги, совместимость пагинации.

Произвольный метод

Также с v0.9.4 метод map() регистрирует маршрут для любого HTTP-метода. Это удобно, когда глагол известен только во время выполнения, когда один обработчик обслуживает несколько методов, или для нестандартных глаголов:

use volga::{App, ok};
use volga::http::Method;

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let mut app = App::new();

    app.map(Method::GET, "/hello", || async {
        ok!("Hello, World!")
    });

    // строковый глагол и шаблон, собранный во время выполнения, тоже работают
    app.map("QUERY", format!("/search/{}", "v1"), || async {
        ok!("search results...")
    });

    app.run().await
}

Аргумент method принимает всё, что преобразуется в Method, включая строковые глаголы, а шаблон — как заимствованный &str (без аллокации), так и владеющий String, собранный во время выполнения.

Примечание

map() паникует, если метод не преобразуется в корректный Method. Маршруты регистрируются на старте, поэтому некорректный глагол — это ошибка программиста, а не состояние времени выполнения.

Последнее обновление: 14.09.2026, 06:45
Next
HTTPS