动手
前面各部分是读 axum 的源码,这一部分反过来:不依赖 axum,自己把装配主线和请求主线写一遍。写完再回头看,Handler<T, S> 为什么非要一个调用方从不手写的 T,FromRequest 为什么多一个 M,Router 为什么要把每个 handler 装进盒子,都会变成你自己碰到过的编译错误。
- 从零写一个 mini-axum:
IntoResponse、FromRequestParts/FromRequest加ViaPartsblanket impl、用宏为 0–3 个参数的函数实现Handler<T, S>、按「方法 + 精确路径」分发的Router;去掉标记类型时的 E0207 和 E0119 原样贴出;用 hyper 起服务、hyper 客户端发 10 个请求验证;最后一张表列出它和 axum 的差距:matchit 路由树、状态与with_state、MethodRouter与 405、nest、中间件、拒绝类型、装箱。
flowchart TB resp[IntoResponse] --> ext["FromRequestParts 与 FromRequest"] ext --> h["宏实现 Handler"] h --> err["去掉标记:E0207、E0119"] h --> r["Router:擦类型、精确匹配"] r --> svc["tower Service 交给 hyper"] svc --> verify["真实请求验证"] verify --> diff["对照 axum"]
💬 关联讨论
发起讨论加载中...