路由与中间件
学习目标
- 掌握路由组合
- 掌握中间件
- 理解 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)) |
| CORS | CorsLayer |
| 静态文件 | ServeDir |