Работа с 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)
}
Больше примеров можно найти здесь.