我正在尝试使用 serde_json 将请求正文解析为强类型对象:
#[macro_use]
extern crate serde_derive; // 1.0.70
extern crate futures; // 0.1.23
extern crate hyper; // 0.12.7
extern crate serde_json; // 1.0.24
use futures::{Future, Stream};
use hyper::{Body, Request};
struct AppError;
#[derive(Serialize, Deserialize)]
struct BasicLoginRequest {
email: String,
password: String,
}
impl BasicLoginRequest {
fn from(req: Request<Body>) -> Result<BasicLoginRequest, AppError> {
let body = req
.body()
.fold(Vec::new(), |mut v, chunk| {
v.extend(&chunk[..]);
futures::future::ok::<_, hyper::Error>(v)
}).and_then(move |chunks| {
let p: BasicLoginRequest = serde_json::from_slice(&chunks).unwrap();
futures::future::ok(p)
}).wait();
Ok(body.unwrap())
}
}
fn main() {}
我得到的错误是:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:20:20
|
20 | let body = req
| ____________________^
21 | | .body()
| |___________________^ cannot move out of borrowed content
从展开时无法移出借用的内容我知道展开时会发生此错误,因为需要一个值但提供了一个引用。错误点在req.body()
; 似乎req.body()
返回一个引用,而不是一个值......
尝试处理正文的代码基于 从 Hyper 请求中提取正文作为字符串复制粘贴的摘录
我该如何进行这项工作?