0Pricing
Learn Rust Coding · Урок

Промежуточное ПО

Слои Tower

«Промежуточное ПО» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.

Что такое промежуточное ПО?

Промежуточное ПО выполняет код до и после обработчика, оборачивая цикл обработки запроса и ответа. Используйте его для ведения журнала, аутентификации, сжатия и ограничения времени выполнения.

  • Axum построен на экосистеме tower
  • Промежуточное ПО добавляется в виде уровней

Трейт Service

Tower определяет Service — компонент, который принимает запрос и асинхронно формирует ответ. Уровни оборачивают один сервис в другой.

Добавление уровня

Подключите промежуточное ПО с помощью .layer(). Здесь мы добавляем трассировку запросов из tower_http.

use axum::{Router, routing::get};
use tower_http::trace::TraceLayer;

fn app() -> Router {
    Router::new()
        .route("/", get(|| async { "ok" }))
        .layer(TraceLayer::new_for_http())
}

Порядок уровней

Уровни оборачиваются снизу вверх: последний добавленный уровень становится внешним. Запросы проходят от внешнего уровня к внутреннему, а ответы — от внутреннего к внешнему.

use axum::{Router, routing::get};
use tower_http::{trace::TraceLayer, compression::CompressionLayer};

fn app() -> Router {
    Router::new()
        .route("/", get(|| async { "ok" }))
        .layer(CompressionLayer::new())
        .layer(TraceLayer::new_for_http())
}

Пользовательское промежуточное ПО с from_fn

middleware::from_fn превращает асинхронную функцию в промежуточное ПО. Она получает запрос и Next, который нужно вызвать для продолжения цепочки.

use axum::{middleware::Next, response::Response, extract::Request};

async fn log_mw(req: Request, next: Next) -> Response {
    println!("{} {}", req.method(), req.uri());
    next.run(req).await
}

Подключение пользовательского промежуточного ПО

Оберните свою функцию с помощью from_fn и добавьте её как уровень.

use axum::{Router, routing::get, middleware};

fn app() -> Router {
    Router::new()
        .route("/", get(|| async { "ok" }))
        .layer(middleware::from_fn(log_mw))
}

Досрочное завершение запросов

Промежуточное ПО может сразу вернуть ответ, не вызывая next; это полезно, например, для аутентификации. Возврат ответа останавливает цепочку.

use axum::{middleware::Next, response::Response, extract::Request, http::StatusCode};

async fn auth(req: Request, next: Next) -> Result<Response, StatusCode> {
    if req.headers().contains_key("authorization") {
        Ok(next.run(req).await)
    } else {
        Err(StatusCode::UNAUTHORIZED)
    }
}

Моделирование цепочки промежуточного ПО

Цепочка — это всего лишь функции, вызывающие следующую функцию. Этот запускаемый пример показывает обёртку, выполняемую до и после вызова.

fn handler() -> String {
    "response".to_string()
}

fn logging<F: Fn() -> String>(next: F) -> String {
    println!("-> request in");
    let res = next();
    println!("<- response out");
    res
}

fn main() {
    let out = logging(handler);
    println!("body: {}", out);
}

Промежуточное ПО для отдельного маршрута

Примените уровень только к одному маршруту, вызвав .layer() у маршрутизатора метода, а не у всего приложения.

use axum::{Router, routing::get, middleware};

fn app() -> Router {
    Router::new().route(
        "/admin",
        get(|| async { "admin" }).layer(middleware::from_fn(auth)),
    )
}

Распространённые уровни tower_http

Крейт tower_http предоставляет готовое промежуточное ПО:

  • TraceLayer — для ведения журнала
  • CompressionLayer — для gzip
  • CorsLayer — для CORS
  • TimeoutLayer — для ограничения времени обработки запроса
use tower_http::cors::CorsLayer;

fn cors() -> CorsLayer {
    CorsLayer::permissive()
}

Объединение с ServiceBuilder

Объединяйте несколько уровней с помощью ServiceBuilder. Он применяет их сверху вниз, обеспечивая предсказуемый порядок.

use tower::ServiceBuilder;
use tower_http::{trace::TraceLayer, compression::CompressionLayer};

fn stack() -> ServiceBuilder<impl Sized> {
    ServiceBuilder::new()
        .layer(TraceLayer::new_for_http())
        .layer(CompressionLayer::new())
}

Быстрая проверка

Проверьте, насколько хорошо Вы поняли промежуточное ПО.

Повторение

Вы изучили промежуточное ПО с уровнями tower:

  • Добавляйте промежуточное ПО через .layer(); последний добавленный уровень становится внешним
  • from_fn создаёт пользовательское промежуточное ПО с помощью Next
  • Возвращайте ответ досрочно, чтобы остановить цепочку, например при аутентификации
  • tower_http предоставляет уровни трассировки, сжатия, CORS и ограничения времени

На этом курс по Axum завершён.

Часто задаваемые вопросы

Урок «Промежуточное ПО» бесплатный?

Да — полный текст урока «Промежуточное ПО» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.

Чему я научусь в уроке «Промежуточное ПО»?

Слои Tower Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn Rust Coding?

Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Промежуточное ПО»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn Rust Coding?

Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

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