服务
前面几部分都是中间件:包着一个内层,在三个时刻里动手。services 模块里的不一样,它们不包内层,自己就产生响应,模块文档管它们叫「leaf services」。Error 都是 Infallible,IO 出错也变成 404 或 500 响应。ServeDir / ServeFile 怎么从 URI 找到文件、怎么处理目录、预压缩、Range 和条件请求,axum 卷 ServeDir 与 ServeFile 已经讲完。这一部分讲剩下的:
- ServeDir 的 Backend trait:0.7.0 把文件系统操作抽成
Metadata、File、Backend三个 trait;File::MetadataFuture<'a>是 GAT,同一个提交把 MSRV 提到 1.65;用include_bytes!写一个内嵌 backend;拿不到 mtime 时没有ETag,告警由rate_limited!限频。 - Redirect 服务:任意请求进、固定的 3xx 出;非 3xx 在构造时 panic,304 却能通过;
Location不随请求变;和 axum 的Redirect响应对照。
flowchart TB req[请求] --> sd["ServeDir"] sd --> be["Backend:TokioBackend 或自己实现"] be --> resp1["200、206、304、404、500"] req --> rd["Redirect"] rd --> resp2["固定的 3xx 和 Location"] sd -.->|"fallback / not_found_service"| other[另一个服务]
两者都可以挂在 axum 的 Router::fallback_service、nest_service 上,也可以直接交给 hyper 当整个服务。
💬 关联讨论
发起讨论加载中...