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

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

    • Заголовки (Headers)
    • Работа с JSON
    • Работа с Form Data
    • Работа с файлами
    • Cookies
  • Middleware и инфраструктура

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

    • Аутентификация и авторизация
  • Надежность и наблюдаемость

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

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

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

Работа с JSON

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

Получение JSON

Чтобы принять JSON в теле запроса и десериализовать его в строго типизированную сущность, используйте структуру Json<T>. Тип T должен быть десериализуемой структурой, поэтому убедитесь, что он реализует типаж Deserialize из serde:

use volga::{App, Json, 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: Json<User>| async move {
        ok!("Привет, {}!", user.name)
    });

    app.run().await
}

Для тестирования можно использовать команду curl следующим образом:

curl -X POST "http://127.0.0.1:7878/hello" -H "Content-Type: application/json" -d "{ \"name\": \"John\", \"age\": 35 }"
Привет, John!

Совет

Вы можете обернуть поля вашей структуры в Option<T>, как описано в разделе Обработка опциональных параметров запроса.

Отправка JSON

Для отправки ответов в формате JSON Волга предоставляет макрос ok!:

use volga::{App, ok};
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("/hello", || async {
        let user: User = User {
            name: "John".into(),
            age: 35
        };

        ok!(user)
    });

    app.run().await
}

Проверяем:

> curl http://127.0.0.1:7878/hello
{"name":"John","age":35}

Кроме того, с помощью макроса ok! можно использовать и неструктурированные JSON-данные:

use volga::{App, ok};

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

    app.map_get("/hello", || async {
        ok!({ name: "John", age: 35 })
    });

    app.run().await
}

Указание статуса вместе с JSON

Вы также можете включать HTTP-статусы в ваши JSON-ответы с помощью макроса status!:

use volga::{App, status};
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("/hello", || async {
        let user: User = User {
            name: "John".into(),
            age: 35
        };

        status!(200, user)
    });

    app.run().await
}

Тело JSON можно дополнить стандартными HTTP-статусами, такими как 200, 400, 401, 403 и другими, чтобы предоставлять понятные сообщения для клиента.

Вот полный пример.

Последнее обновление: 18.01.2026, 18:33
Prev
Заголовки (Headers)
Next
Работа с Form Data