SuperAPI AI 工具集

axum-errors-extractor-rejections

编程与开发

查看项目

更新于 10-16 09:56

技能介绍

用途:当 Axum 的 Json、Path、Query、Form、Bytes、String、Extension 等提取器失败时,本技能帮助控制返回的 HTTP 错误响应,将默认的纯文本错误替换为自定义形状(如 JSON 错误体)。

主要能力:Axum 内置提取器的 Rejection 位于 axum::extract::rejection 模块,各 Rejection 枚举提供 status() 与 body_text() 方法。自定义方式由轻到重共四种:使用 Result<T, T::Rejection> 处理器参数、使用 axum-extra 的 WithRejection<E, R>、使用 #[derive(FromRequest)] 配合 rejection(...),以及手写自定义提取器。

使用方式:匹配 Rejection 枚举时必须包含 _ => 兜底分支,因为枚举标注为 #[non_exhaustive];应复用 rejection.status() 与 body_text(),不要自造状态码;自定义提取器的 Rejection 类型必须实现 IntoResponse;不要为同一具体类型同时实现 FromRequest 与 FromRequestParts。WithRejection 需要 axum-extra 的 with-rejection 特性,derive(FromRequest) 需要 axum 的 macros 特性。

适用场景:仅一两个处理器需要定制错误时用 Result 参数;大量处理器需统一重映射时用 WithRejection 或 derive 方案;提取过程需读取其他请求部分(如 MatchedPath、请求头)时用手写自定义提取器。

限制与变更:Axum 0.7 中 Option<Extractor> 会吞掉所有失败并返回 None;0.8 中 Option<T> 基于 OptionalFromRequest(Parts),值确实缺失才返回 None,值存在但格式错误会直接产生 4xx 响应。从 0.7 升级到 0.8 后应审查所有 Option<Extractor> 处理器参数,如需恢复旧行为可改用 Result<T, T::Rejection> 并将 Err 映射为默认值。