1

我正在尝试在 warp 中记录请求/响应主体。

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

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

我可以在使用反序列化后记录正文

warp::body::json().map(|it| {
    println!("Hello : {:?}", it);
    it
})

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

4

1 回答 1

5

我自己在寻找解决方案时偶然发现了这一点,所以它可能对将来的某个人有用。

您可以使用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);

有关完整示例,您可以查看我准备的要点。

于 2020-05-18T06:22:59.080 回答