0Pricing
Learn Rust Coding · Урок

Извлекатели

Разбор запросов

«Извлекатели» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Маршрутизация Axum
  2. Извлекатели
  3. JSON и состояние
  4. Промежуточное ПО
← Назад к Learn Rust Coding