如何将http :: HeaderMap序列化为JSON?

时间:2019-04-12 14:29:30

标签: http rust

在Rust中将HTTP请求标头(http::HeaderMap)序列化为JSON的正确方法是什么?

我正在实现AWS Lambda函数,并且希望有一个简单的echo函数用于调试。

ECDSA_SIG

是否有一种简单的方法可以将i2d_ECDSA_SIG转换为JSON并返回?

1 个答案:

答案 0 :(得分:2)

没有“适当”的方法。就像没有为结构自动实现Display的“正确”方法一样,也没有一种将某些数据序列化为JSON的真实方法。

如果您所需要做的只是获取某事作为JSON,并且由于这是用于调试,我只需打印出标头的调试形式,然后将其转换为{{ 3}}:

use http::{header::HeaderValue, HeaderMap}; // 0.1.17
use serde_json; // 1.0.39 

fn convert(headers: &HeaderMap<HeaderValue>) -> serde_json::Value {
    format!("{:?}", headers).into()
}

如果您想要一些更结构化的内容,可以(亏本!)将标头转换为HashMap<String, Vec<String>>。这种类型可以简单地序列化为JSON对象:

use http::{header::HeaderValue, HeaderMap}; // 0.1.17
use std::collections::HashMap;

fn convert(headers: &HeaderMap<HeaderValue>) -> HashMap<String, Vec<String>> {
    let mut header_hashmap = HashMap::new();
    for (k, v) in headers {
        let k = k.as_str().to_owned();
        let v = String::from_utf8_lossy(v.as_bytes()).into_owned();
        header_hashmap.entry(k).or_insert_with(Vec::new).push(v)
    }
    header_hashmap
}