Волга
Главная
API Docs
GitHub
  • English
  • Русский
Главная
API Docs
GitHub
  • English
  • Русский
  • Главная
  • Основы

    • Быстрый старт
    • Параметры маршрута
    • Параметры запроса
    • Группировка маршрутов
    • Заголовки (Headers)
  • Форматы данных

    • Работа с JSON
    • Работа с Form Data
    • Работа с файлами
    • Server-Sent Events (SSE)
  • Протоколы

    • HTTP/1 and HTTP/2
    • HTTPS
    • WebSockets & WebTransport
  • Продвинутые сценарии

    • Пользовательские Middleware
    • Сжатие ответов
    • Распаковка запросов
    • Центральный обработчик ошибок
    • Внедрение Зависимостей
    • Логгирование и Трассировка
    • Статические файлы
    • CORS (Cross-Origin Resource Sharing)
    • Cookies
    • Отмена запросов
    • Пользовательская обработка методов HEAD, OPTIONS и TRACE

Параметры запроса

Волга поддерживает извлечение параметров запроса в специальную структуру при помощи Query<T>. T может быть либо десериализуемой структурой, либо HashMap.
Если вы хотите использовать свою структуру, как и в случае с Path<T> для параметров маршрута, убедитесь, что у вас установлена библиотека serde.

Доступ к параметрам запроса

В качестве примера, как получить доступ к параметрам запроса, можно рассмотреть следующий код:

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

#[derive(Deserialize)]
struct Params {
    name: String,
}

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

    app.map_get("/hello", |params: Query<Params>| async move {
        // Здесь вы можете напрямую обращаться к полям структуры params
        ok!("Hello {}!", params.name)
    });

    app.run().await
}

Тестирование API с параметрами запроса

Вы можете протестировать API, выполняя запросы с параметрами запроса:

> curl "http://localhost:7878/hello?name=John"
Hello John!

> curl "http://localhost:7878/hello?name=Jane"
Hello Jane!

> curl "http://localhost:7878/hello?name=World"
Hello World!

Обработка нескольких параметров запроса

Для API, которые требуют нескольких параметров запроса, настройка выполняется аналогично:

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

#[derive(Deserialize)]
struct Params {
    name: String,
    age: u32,
    email: String,
}

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

    app.map_get("/hello", |params: Query<Params>| async move {
        // Здесь вы можете напрямую обращаться к полям структуры params
        ok!("Hello {} (email: {})! Your age is: {}", params.name, params.email, params.age)
    });

    app.run().await
}

Пример запроса с несколькими параметрами:

> curl "http://localhost:7878/hello?name=John&age=33&email=john@email.com"
Hello John (email: john@email.com)! Your age is: 33

Обработка опциональных параметров

В приведенном выше примере, если выполнить запрос без указания одного из параметров (например, email), сервер вернет ошибку 400 BAD REQUEST:

> curl "http://localhost:7878/hello?name=John&age=33"

< HTTP/1.1 400 BAD REQUEST
Query parsing error: missing field `email`

Однако, если необходимо сделать некоторые параметры необязательными, можно использовать Option<T>, как показано ниже:

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

#[derive(Deserialize)]
struct Params {
    name: String,
    age: u32,
    email: Option<String>, // email становится необязательным параметром
}

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

    app.map_get("/hello", |params: Query<Params>| async move {
        if let Some(email) = params.email {
            ok!("Hello {} (email: {})! Your age is: {}", params.name, email, params.age)
        } else {
            ok!("Hello {}! Your age is: {}", params.name, params.age)
        }
    });

    app.run().await
}

Полный пример доступен здесь.

Last Updated:
Prev
Параметры маршрута
Next
Группировка маршрутов