将 hyper body 反序列化为 utf8 字符串:错误 [E0597]:`bytes` 的寿命不够长

Deserializing hyper body into utf8 string: error[E0597]: `bytes` does not live long enough

我想编写一个实用程序,将给定的请求正文反序列化为目标类型 (T):

pub async fn read_json_body<'a, T>(req: &'a mut Request<Body>) -> T where T : Deserialize<'a> {
    let mut body = req.body_mut();
    let bytes = body::to_bytes(body).await.unwrap();
    let body_str = std::str::from_utf8(&*bytes).unwrap();
    serde_json::from_str::<T>(body_str).unwrap()
}

当我尝试编译代码时,出现以下错误:

error[E0597]: `bytes` does not live long enough

21 |     pub async fn read_json_body<'a, T>(req: &'a mut Request<Body>) -> T where T : Deserialize<'a> {
   |                                 -- lifetime `'a` defined here
...
24 |         let body_str = std::str::from_utf8(&*bytes).unwrap();
   |                                              ^^^^^ borrowed value does not live long enough
25 |         serde_json::from_str::<T>(body_str).unwrap()
   |         ----------------------------------- argument requires that `bytes` is borrowed for `'a`
26 |     }
   |     - `bytes` dropped here while still borrowed

我知道 Deserialize trait 需要生命周期 'a 才能超过反序列化,这就是将生命周期分配给请求引用的原因。但是我不明白我的选择是什么来修复这个关于字节对象生命周期的错误。

我该如何解决这个问题?

要求:

改为使用限制为 DeserializeOwned 的自有版本:

pub async fn read_json_body<T>(req: &mut Request<Body>) -> T where T : DeserializeOwned {
    let mut body = req.body_mut();
    let bytes = body::to_bytes(body).await.unwrap();
    let body_str = std::String::from_utf8(&*bytes).unwrap();
    serde_json::from_str::<T>(&body_str).unwrap()
}