Параметры после вопроса в Rust
После пути клиент может добавить параметры через знак вопроса и пары ключ со значением. Библиотека собирает их в карту или в структуру с полями, если имена совпадают с ключами в строке запроса.
Обработчик получает их вторым аргументом через тип из модуля извлечения. Для структуры нужны трейты разбора полей, для карты достаточно стандартной коллекции со строковым ключом.
Прочитаем все пары в карту и вернем
значение по ключу q:
use std::collections::HashMap;
use axum::{Router, extract::Query, routing::get};
async fn search(Query(params): Query<HashMap<String, String>>) -> String {
match params.get("q") {
Some(text) => text.clone(),
None => String::from("empty"),
}
}
#[tokio::main]
async fn main() {
let app = Router::new().route("/search", get(search));
let listener = match tokio::net::TcpListener::bind("127.0.0.1:3000").await {
Ok(l) => l,
Err(e) => {
eprintln!("{}", e);
return;
}
};
match axum::serve(listener, app).await {
Ok(()) => {}
Err(e) => eprintln!("{}", e),
}
}
Запрос /search?q=rust отдает текст
rust. Без ключа q вернется
empty по ветке сопоставления.
Свою структуру удобно объявить с полями под ожидаемые ключи. Для разбора полей добавьте крейт с пометкой:
cargo add serde --features derive
Дальше свяжем адрес со структурой параметров:
use axum::{Router, extract::Query, routing::get};
use serde::Deserialize;
#[derive(Deserialize)]
struct Page {
page: Option<u32>,
size: Option<u32>,
}
async fn list(Query(opts): Query<Page>) -> String {
let page = match opts.page {
Some(n) => n,
None => 1,
};
let size = match opts.size {
Some(n) => n,
None => 10,
};
format!("page {} size {}", page, size)
}
#[tokio::main]
async fn main() {
let app = Router::new().route("/list", get(list));
let listener = match tokio::net::TcpListener::bind("127.0.0.1:3000").await {
Ok(l) => l,
Err(e) => {
eprintln!("{}", e);
return;
}
};
match axum::serve(listener, app).await {
Ok(()) => {}
Err(e) => eprintln!("{}", e),
}
}
Дан путь:
/find?q=axum
Верните значение ключа q из
карты параметров или none, если
ключа нет.
Дан путь:
/list?page=2
Опишите текст ответа для структуры
Page из примера, если size
в запросе не указан.
Скажите, чем карта параметров отличается от структуры с именованными полями при лишних ключах в строке запроса.