如何在Poem Web中查看触发400错误的请求内容
解决Poem-web中400错误的请求体查看问题
方法一:调整日志级别并启用内置Logger中间件
- 修改日志配置:将
RUST_LOG级别提升到trace,确保捕获请求体相关的详细日志:if env::var_os("RUST_LOG").is_none() { env::set_var("RUST_LOG", "poem=trace,hyper=debug"); } tracing_subscriber::fmt::init(); - 注册Logger中间件:在应用中添加Poem自带的
Logger中间件,它会自动记录请求的完整信息(包括请求体):
若请求体过大无法记录,可通过use poem::middleware::Logger; let app = Route::new() .at("/your-endpoint", your_handler) .with(Logger);Logger::new().max_body_size(Some(1024 * 1024))调整允许记录的最大体大小(单位:字节)。
方法二:自定义中间件主动捕获请求体
如果默认Logger不满足需求,可编写自定义中间件在请求到达时读取并记录请求体:
use poem::{ middleware::Middleware, web::RequestBody, Error, Request, Response, Result, }; struct RequestBodyLogger; impl Middleware for RequestBodyLogger { async fn handle(&self, mut req: Request, next: poem::middleware::Next<'_>) -> Result<Response> { // 读取请求体字节 let body = req.take_body().into_bytes().await?; // 打印或记录请求体内容 tracing::debug!("Request body content: {}", String::from_utf8_lossy(&body)); // 将请求体放回请求,保证后续流程正常读取 req.set_body(RequestBody::from(body)); next.run(req).await } } // 注册自定义中间件 let app = Route::new() .at("/your-endpoint", your_handler) .with(RequestBodyLogger);
方法三:在解析错误中捕获请求体
400错误多由请求体解析失败导致,可在错误处理逻辑中针对性捕获并记录:
use poem::{error::ParseJsonError, handler, web::Json, Error, Result}; #[handler] async fn your_handler(Json(payload): Json<YourPayload>) -> Result<String> { Ok(format!("Hello: {}", payload.name)) } // 自定义全局错误处理 impl poem::ErrorHandler for YourApp { async fn handle_error(&self, err: Error, req: &Request) -> Response { if let Some(parse_err) = err.downcast_ref::<ParseJsonError>() { // 尝试读取原始请求体 if let Ok(body) = req.body().clone().into_bytes().await { tracing::error!("JSON parse failed: {}, raw body: {}", parse_err, String::from_utf8_lossy(&body)); } } // 其他错误处理逻辑 err.into_response() } }
内容的提问来源于stack exchange,提问作者Finlay Weber
相关产品推荐
相关产品推荐

