Волга
Главная
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

Работа с Form Data

Волга поможет вам легко обрабатывать данные форм в ваших веб-приложениях, как для приема входящих данных в запросах, так и для отправки ответов с данными форм.

Получение Form Data

Для принятия данных формы в теле запросе и десериализации его в строго типизированную сущность, используйте структуру Form<T>. Где T должен быть десериализуемый тип, либо HashMap. В случае своей структуры убедитесь, что она реализует Deserialize из serde:

use volga::{App, Form, ok};
use serde::Deserialize;
 
#[derive(Deserialize)]
struct User {
    name: String,
    age: i32
}

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

    // POST /hello
    // name=John&age=35
    app.map_post("/hello", |user: Form<User>| async move {
        ok!("Hello {}!", user.name)
    });

    app.run().await
}

Чтобы протестировать этот код, вы можете использовать команду curl следующим образом:

curl -X POST "http://127.0.0.1:7878/hello" -H "Content-Type: application/x-www-form-urlencoded" --data-urlencode name=John&age=35
Hello John!

Совет

Аналогично Json<T> вы можете обернуть поля структуры в Option<T> чтобы сделать их опциональными.

Отправка Form Data

Чтобы отправить ответ с данными формы, вы можете использовать макрос form!:

use volga::{App, Form, form};
use serde::Serialize;
 
#[derive(Serialize)]
struct User {
    name: String,
    age: i32
}

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

    app.map_get("/user/{name}", |name: String| async move {
        let user: User = User {
            name,
            age: 35
        };
        form!(user)
    });

    app.run().await
}

В качестве альтернативы, указав Form<T> в качестве возвращаемого типа, вы можете вернуть структуру вашего типа напрямую, благодаря типажу IntoResponse:

use volga::{App, Form};
use serde::Serialize;
 
#[derive(Serialize)]
struct User {
    name: String,
    age: i32
}

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

    app.map_get("/user/{name}", get_user);

    app.run().await
}

async fn get_user(name: String) -> Form<User> {
    let user: User = User {
        name,
        age: 35
    };
    user.into() //либо Form(user)
}

Больше примеров можно найти здесь.

Last Updated:
Prev
Работа с JSON
Next
Работа с файлами