Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpHsPm 252 of 288 menu
◀ ▶

Параметры после вопроса в 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 в запросе не указан.

Скажите, чем карта параметров отличается от структуры с именованными полями при лишних ключах в строке запроса.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить