将 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
才能超过反序列化,这就是将生命周期分配给请求引用的原因。但是我不明白我的选择是什么来修复这个关于字节对象生命周期的错误。
我该如何解决这个问题?
要求:
- 我不想将请求移动到函数的范围内
- 我不想在 util 之外从请求中提取主体,请求应该是函数的参数,而不是主体
改为使用限制为 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()
}
我想编写一个实用程序,将给定的请求正文反序列化为目标类型 (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
才能超过反序列化,这就是将生命周期分配给请求引用的原因。但是我不明白我的选择是什么来修复这个关于字节对象生命周期的错误。
我该如何解决这个问题?
要求:
- 我不想将请求移动到函数的范围内
- 我不想在 util 之外从请求中提取主体,请求应该是函数的参数,而不是主体
改为使用限制为 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()
}