Вернуть объект JsonValue из actix-web HttpRequest

Я читаю примеры actix-web, но поскольку я новичок в Rust, у меня возникли некоторые проблемы с пониманием того, как адаптировать код к моим потребностям.

Учитывая actix-web HttpRequest, я хочу проанализировать полезную нагрузку и вернуть JsonValue. Я не могу понять, как изменить эту функцию, чтобы она возвращала JsonValue, а не HttpResponse.

fn index_mjsonrust(req: &HttpRequest, ) -> Box<Future<Item = HttpResponse, Error = Error>> {
    req.payload()
        .concat2()
        .from_err()
        .and_then(|body| {
            // body is loaded, now we can deserialize json-rust
            let result = json::parse(std::str::from_utf8(&body).unwrap()); // return Result
            let injson: JsonValue = match result {
                Ok(v) => v,
                Err(e) => object!{"err" => e.to_string() },
            };
            Ok(HttpResponse::Ok()
                .content_type("application/json")
                .body(injson.dump()))
        })
        .responder()
}

Было бы лучше просто вернуть JsonValue, а не Future?


person Simen Russnes    schedule 15.09.2018    source источник
comment
Просмотрите, как создать минимальный воспроизводимый пример, а затем отредактируйте свой вопрос, чтобы включить его. Мы не можем сказать, какие ящики (и версии), типы, свойства, поля и т. Д. Присутствуют в коде. Важно показать все импортированные типы. Вопросы, требующие помощи по отладке, должны включать конкретную ошибку и кратчайший код, необходимый для ее воспроизведения. Попробуйте создать что-то, что воспроизводит вашу ошибку на Rust Playground, или вы можете воспроизвести это в совершенно новом Cargo проект. Также есть советы MCVE для Rust.   -  person Shepmaster    schedule 15.09.2018


Ответы (1)


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

person Nikolay Kim    schedule 15.09.2018