Извлекатели
Разбор запросов
«Извлекатели» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.
Что такое извлекатель?
Извлекатель — это параметр обработчика, который извлекает для Вас часть запроса. Axum анализирует типы параметров и заполняет их.
- Не требуется разбирать запрос вручную
- Определяется типами и допускает композицию
Извлекатель Path
Path извлекает динамические сегменты URL. Тип внутри определяет способ разбора сегмента.
use axum::extract::Path;
async fn user(Path(id): Path<u32>) -> String {
format!("user {}", id)
}Несколько параметров пути
Извлекайте несколько сегментов, получая кортеж. Порядок соответствует шаблону пути.
use axum::extract::Path;
async fn item(Path((cat, id)): Path<(String, u32)>) -> String {
format!("{} / {}", cat, id)
}Извлекатель Query
Query десериализует строку параметров URL в структуру с помощью serde. Это удобно для фильтрации и разбиения на страницы.
use axum::extract::Query;
use serde::Deserialize;
#[derive(Deserialize)]
struct Page { page: u32 }
async fn list(Query(p): Query<Page>) -> String {
format!("page {}", p.page)
}Извлекатель тела JSON
Json десериализует тело запроса в структуру. Для структуры должен быть реализован Deserialize.
use axum::Json;
use serde::Deserialize;
#[derive(Deserialize)]
struct NewUser { name: String }
async fn create(Json(u): Json<NewUser>) -> String {
format!("created {}", u.name)
}Извлекатель заголовков
Получайте доступ к заголовкам с помощью извлекателя HeaderMap или типизированных извлекателей заголовков. Это удобно для токенов аутентификации.
use axum::http::HeaderMap;
async fn show(headers: HeaderMap) -> String {
match headers.get("x-api-key") {
Some(v) => format!("key: {:?}", v),
None => "no key".to_string(),
}
}Порядок извлекателей важен
Извлекатели, потребляющие тело, например Json, должны находиться последними в списке параметров, поскольку тело можно прочитать только один раз.
use axum::{Json, extract::Path};
use serde::Deserialize;
#[derive(Deserialize)]
struct Body { value: i32 }
async fn h(Path(id): Path<u32>, Json(b): Json<Body>) -> String {
format!("{} {}", id, b.value)
}Моделирование извлечения на обычном Rust
Извлечение — это всего лишь разбор типизированных данных из запроса. Здесь мы десериализуем строку, похожую на строку параметров запроса, в числа.
fn parse_query(q: &str) -> Option<u32> {
q.strip_prefix("page=")?.parse().ok()
}
fn main() {
println!("{:?}", parse_query("page=3"));
println!("{:?}", parse_query("bad"));
}Необязательное извлечение
Оберните экстрактор в Option, чтобы ошибка не была критической. Отсутствующее или недопустимое значение даст None, а не ответ с ошибкой.
use axum::extract::Query;
use serde::Deserialize;
#[derive(Deserialize)]
struct Filter { q: String }
async fn search(filter: Option<Query<Filter>>) -> String {
match filter {
Some(Query(f)) => f.q,
None => "no filter".to_string(),
}
}Отклонения
Если экстрактор завершается ошибкой, он возвращает отклонение, которое превращается в ответ HTTP с ошибкой. Например, недопустимый JSON автоматически приводит к ответу 422.
use axum::extract::rejection::JsonRejection;
use axum::Json;
async fn create(body: Result<Json<i32>, JsonRejection>) -> String {
match body {
Ok(Json(n)) => format!("ok {}", n),
Err(_) => "bad body".to_string(),
}
}Объединение экстракторов
Обработчик может одновременно использовать несколько экстракторов. Axum заполняет каждый из них данными из соответствующей части запроса.
use axum::{Json, extract::{Path, Query}};
use serde::Deserialize;
#[derive(Deserialize)]
struct Q { sort: String }
#[derive(Deserialize)]
struct B { name: String }
async fn h(Path(id): Path<u32>, Query(q): Query<Q>, Json(b): Json<B>) -> String {
format!("{} {} {}", id, q.sort, b.name)
}Быстрая проверка
Проверьте, насколько хорошо Вы поняли экстракторы.
Повторение
Вы научились разбирать запросы с помощью экстракторов:
Path— для сегментов URL,Query— для строки параметров запросаJson— для тела запроса (должен быть последним)HeaderMap— для заголовковOptionиResultпозволяют корректно обрабатывать ошибки
Далее: общее состояние и ответы JSON.
Часто задаваемые вопросы
Урок «Извлекатели» бесплатный?
Да — полный текст урока «Извлекатели» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.
Чему я научусь в уроке «Извлекатели»?
Разбор запросов Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn Rust Coding?
Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Извлекатели»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn Rust Coding?
Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.