Не удается выйти из заимствованного содержимого при попытке десериализации hyper :: Request.body ()

Я пытаюсь разобрать тело запроса на строго типизированный объект с помощью 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() возвращает ссылку, а не значение ...

Код, который пытается обработать тело, основан на отрывке, скопированном из Извлечение тела из гиперзапроса в виде строки

Как мне заставить это работать?


person AunAun    schedule 13.08.2018    source источник


Ответы (1)


Я настоятельно рекомендую прочитать (по крайней мере, бегло просмотреть) документацию по используемым типам, особенно если у вас возникли проблемы с их использованием.

Например, Request::body определяется как:

pub fn body(&self) -> &T

Следующие два метода:

Вы хотите использовать into_body.

Я также использую Control - F в моем веб-браузере для поиска -> T, когда я знаю, что нерабочий метод возвращает -> &T.

person Shepmaster    schedule 13.08.2018