Получение запроса от Hyper, анализ JSON и превращение его в структуру в ржавчине - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь создать веб-сервер, который принимает некоторые параметры в виде JSON и превращает их в структуру, которую я затем сохраню в другом месте моего приложения.

У меня есть эта структура данных в файлевызываемый status.rs:

use serde::{Serialize, Deserialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Status {
    pub id: String,
    pub rssi: Option<i8>,
    pub carrier: Option<String>,
    pub timestamp: u64,
}

Затем я использую следующий код внутри службы в Hyper, чтобы попытаться проанализировать тело запроса и превратить его в мою структуру.Единственное отличие состоит в том, что я хочу добавить поле метки времени в соответствии с меткой времени на сервере, а не на клиенте:

let timestamp: u64 = SystemTime::now()
    .duration_since(UNIX_EPOCH)
    .expect("PANIC! Time is running backwards!")
    .as_secs();

Box::new(req.into_body().concat2().map(|body| {
    let body_bytes = body.into_bytes();
    let body_str = match str::from_utf8(&body_bytes) {
        Ok(v) => v,
        Err(e) => {
            // TODO: this is shitty error handling
            panic!("Unable to read UTF8 input: {}", e);
        }
    };
    let input_data: Value = serde_json::from_str(body_str).unwrap();
    let data = Status {
        id: input_data.get("id").unwrap(),
        timestamp: timestamp,
        rssi: input_data.get("rssi"),
        carrier: input_data.get("carrier"),
    };

    update(data);
}));

Функция обновления просто вставляет его в структуру хранения данных.

Я пытался сделать это несколькими различными способами, но этот способ дает мне проблему, что каждое из этих полей имеет тип Option<&Value> (я думаю).

Надеюсь, результат, который я пытаюсьВыполнение достаточно ясно, я просто не знаю, как получить тело запроса, проанализировать JSON, добавить временную метку и упаковать ее в структуру, которую я затем сохраню в своей базе данных.

Как мне следуетпойти на это?

1 Ответ

0 голосов
/ 17 февраля 2019

Вы пытаетесь преобразовать тело в байтовый фрагмент, затем в строку, затем в serde_json::Value, затем в Status.Довольно много ненужных промежуточных шагов, верно?Просто прочитайте документы:

let body = req.into_body().concat2().wait().unwrap().into_bytes();
let s: Status = serde_json::from_slice(&body).unwrap();

...