用途:为 Axum 服务添加中间件,例如日志或计时层、鉴权门、请求头改写,以及任何需要在处理函数前后运行的横切代码。Axum 自身没有中间件系统,而是集成 Tower 生态(tower::Service 与 tower::Layer),axum::middleware 模块提供辅助函数,使中间件可以写成普通 async fn。
主要能力与三种策略(由窄到宽):map_request / map_response 用于纯单向转换(加请求头、规范化字段),没有 Next,不能短路,也看不到请求与响应两侧;from_fn / from_fn_with_state 接收 Next,可在处理函数前后运行代码并短路;手写 tower::Layer 加 tower::Service 仅在中间件需要可配置或作为 crate 发布时使用。from_fn 的参数顺序由编译器强制:零个或多个 FromRequestParts 提取器,然后一个 FromRequest 提取器,最后是 Next。
使用方式与关键规则:Next 必须是 from_fn 的最后一个参数;Request 必须紧邻 Next 之前;State、HeaderMap、Method 等 FromRequestParts 提取器放在 Request 之前;一个中间件不得使用两个 FromRequest 提取器,因为请求体是单次消费流。所有 .route() 与 .fallback() 必须在调用 .layer() 之前注册,因为层只包裹已存在的路由。鉴权或授权门必须用 .route_layer() 而非 .layer(),否则未匹配路径会先返回 401 而不是 404。from_fn_with_state 的状态需同时传给 from_fn_with_state(state.clone(), ...) 和 .with_state(state)。除非有意短路,否则不要留下未使用的 next。
适用场景:日志与计时、鉴权门、限流、特性开关、安全响应头、请求规范化等。限制与注意:多个 .layer() 链式调用时,最后添加的是最外层,与 tower::ServiceBuilder 的顺序相反;超过两层建议用单个 ServiceBuilder 一次应用。需要可配置或可发布的中间件应改用手写 tower::Layer,详见 axum-impl-tower-stack。资料未提供收费、平台或效果信息。