1

我正在尝试使用 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 请求中提取正文作为字符串复制粘贴的摘录

我该如何进行这项工作?

4

1 回答 1

4

我强烈建议您阅读(至少略读)您使用的类型的文档,尤其是当您在使用它们时遇到问题时。

例如,Request::body定义为:

pub fn body(&self) -> &T

接下来的两种方法是

你想用into_body.

一旦我知道非工作方法返回,我也会在我的网络浏览器中使用Control-F进行搜索。-> T-> &T

于 2018-08-13T14:00:21.730 回答