You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:05:11