如何在翘曲中记录请求/响应主体?

时间:2020-04-17 15:20:10

标签: logging rust rust-warp

我正在尝试记录请求/响应正文。

使用warp::log::custom时,Info结构不包含任何有关它的信息。

在尝试实现自己的日志包装器时,基于warp::log的实现,Route结构是私有的(以及其他)。

使用

反序列化后,我可以记录正文
warp::body::json().map(|it| {
    println!("Hello : {:?}", it);
    it
})

但是,如果用户未发送正确的正文,它将无法正常工作。此外,我正在寻找一种记录所有请求正文的简单方法。

1 个答案:

答案 0 :(得分:1)

我在自己寻找解决方案时偶然发现了这一点,因此也许将来对某人有用。

您可以使用warp::body::bytes()来获取不一定是json格式的正文:

warp::body::bytes()
    .map(|b: Bytes| {
        println!("Request body: {}", std::str::from_utf8(b.bytes()).expect("error converting bytes to &str"));

        "Hello, World!"
    }

为了使其更具通用性,我设法制作了可以在过滤器中轻松使用的功能:

fn log_body() -> impl Filter<Extract = (), Error = Rejection> + Copy {
    warp::body::bytes()
        .map(|b: Bytes| {
            println!("Request body: {}", std::str::from_utf8(b.bytes()).expect("error converting bytes to &str"));
        })
        .untuple_one()
}

它可以这样使用:

    let api = warp::any()
        .and(log_body())
        .and_then(handle);

有关完整示例,您可以签出the gist I have prepared.