5

一部のパラメーターを JSON として受け入れ、それらを構造体に変換してアプリの別の場所に保存する Web サーバーを作成しようとしています。

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 を解析し、タイムスタンプを追加し、構造体にパッケージ化してデータベースに保存する方法がわかりません。

これについてどうすればよいですか?

4

1 に答える 1