Кусок адреса в аргументе в Rust
Когда в шаблоне адреса стоит имя в фигурных скобках, библиотека вырезает соответствующий кусок пути и кладет его в аргумент обработчика. Так один шаблон обслуживает много конкретных адресов с разными идентификаторами.
Имя в скобках пишут без двоеточия, как в современной записи маршрута. Тип аргумента задают оберткой над строкой или числом, которую дает модуль извлечения.
Свяжем адрес с полем id и вернем
его в ответе:
use axum::{Router, extract::Path, routing::get};
#[tokio::main]
async fn main() {
let app = Router::new().route("/user/{id}", get(user));
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),
}
}
async fn user(Path(id): Path<String>) -> String {
format!("user {}", id)
}
Запрос /user/7 дает текст
user 7. Если сегмент не подходит
под тип, ответ будет ошибкой клиента.
Несколько имен в одном шаблоне попадают в кортеж аргументов:
use axum::{Router, extract::Path, routing::get};
async fn pair(Path((left, right)): Path<(String, String)>) -> String {
format!("{}:{}", left, right)
}
#[tokio::main]
async fn main() {
let app = Router::new().route("/pair/{left}/{right}", get(pair));
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),
}
}
Дан путь:
/item/{code}
Верните текст item с подставленным
значением code из адреса.
Дан путь:
/book/{title}/page/{num}
Скажите, сколько параметров получит функция и в каком порядке.
Дан путь:
/user/{id}
Замените тип идентификатора на целое
число и опишите ответ для /user/x.