Rust in Everything
基于 axum 0.8.9

动手

前面各部分是读 axum 的源码,这一部分反过来:不依赖 axum,自己把装配主线和请求主线写一遍。写完再回头看,Handler<T, S> 为什么非要一个调用方从不手写的 T,FromRequest 为什么多一个 M,Router 为什么要把每个 handler 装进盒子,都会变成你自己碰到过的编译错误。

  1. 从零写一个 mini-axum:IntoResponse、FromRequestParts / FromRequest 加 ViaParts blanket 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"]

💬 关联讨论

发起讨论
加载中...