82·Web 开发进阶

路由与中间件

路由与中间件

学习目标

  1. 掌握路由组合
  2. 掌握中间件
  3. 理解 Tower 生态

核心概念

路由组合

use axum::{Router, routing::{get, post}, handler::Handler};

fn user_routes() -> Router {
    Router::new()
        .route("/", get(list_users).post(create_user))
        .route("/{id}", get(get_user).put(update_user).delete(delete_user))
}

fn post_routes() -> Router {
    Router::new()
        .route("/", get(list_posts))
        .route("/{id}", get(get_post))
}

fn app() -> Router {
    Router::new()
        .nest("/api/users", user_routes())
        .nest("/api/posts", post_routes())
}

中间件

use axum::{Router, middleware, http::Request, response::Response};

async fn logging_middleware(
    req: Request<axum::body::Body>,
    next: middleware::Next,
) -> Response {
    println!("{} {}", req.method(), req.uri());
    let response = next.run(req).await;
    println!("状态: {}", response.status());
    response
}

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

CORS

use tower_http::cors::CorsLayer;

fn app() -> Router {
    Router::new()
        .route("/", get(|| async { "Hello" }))
        .layer(CorsLayer::permissive())
}

静态文件

use tower_http::services::ServeDir;

fn app() -> Router {
    Router::new()
        .nest_service("/static", ServeDir::new("static"))
}

小结

功能API
路由嵌套.nest("/prefix", sub_router)
中间件.layer(middleware::from_fn(fn))
CORSCorsLayer
静态文件ServeDir

练习编辑器

rust
Loading...