Промежуточное ПО
Слои 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— для gzipCorsLayer— для CORSTimeoutLayer— для ограничения времени обработки запроса
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 — локальная установка не требуется.
Все уроки этого курса
- Маршрутизация Axum
- Извлекатели
- JSON и состояние
- Промежуточное ПО