我正在尝试记录请求/响应正文。
使用warp::log::custom
时,Info
结构不包含任何有关它的信息。
在尝试实现自己的日志包装器时,基于warp::log
的实现,Route
结构是私有的(以及其他)。
使用
反序列化后,我可以记录正文warp::body::json().map(|it| {
println!("Hello : {:?}", it);
it
})
但是,如果用户未发送正确的正文,它将无法正常工作。此外,我正在寻找一种记录所有请求正文的简单方法。
答案 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.