用途:在 Axum 中实现自定义提取器,即让某个类型从传入请求构建自身。核心判断只有一个问题:提取器是否读取请求体。不读请求体(方法、URI、请求头、扩展、路径参数、状态)实现 FromRequestParts<S>,可出现在任意处理函数参数位置;读取请求体则实现 FromRequest<S>,处理函数最多一个且必须是最后一个参数。两个 trait 都带 Rejection 关联类型,必须实现 IntoResponse,Axum 才能把提取失败直接转成 HTTP 响应。
主要能力与规则:优先用 FromRequestParts 以获得更自由的组合;不要为同一具体类型同时实现两个 trait,因为已有 blanket impl 桥接,手写第二个会导致歧义、无法作为处理函数参数。Rejection 可用 (StatusCode, &'static str) 或 (StatusCode, Json<T>)。在 FromRequest 中应把请求体解析委托给 Json、Form、Bytes 等现有提取器,而不是手工读字节流。
使用方式:读取应用状态时,若需整个状态可绑定具体状态类型;若只需复合状态中的一个字段,用 FromRef 约束并通过 SomeResource::from_ref(state) 获取。用 axum-macros 的 #[derive(FromRequestParts)] 或 #[derive(FromRequest)] 可把多个现有提取器打包成一个参数,支持 #[from_request(via(...))]、#[from_request(rejection(...))]、#[from_request(state(...))] 等属性。
版本差异:Axum 0.8 使用原生 async fn in traits(RPITIT,需 Rust 1.75),0.7 需在 impl 块上加 #[async_trait]。迁移时删除该属性、移除 async-trait 依赖,函数体不变。
限制:具体事实以资料为准,未提供收费、平台等信息。