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

Ist*_*van 4 http rust

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

我正在实现一个 AWS Lambda 函数,我想要一个简单的回声函数来进行调试。

use lambda_http::{lambda, IntoResponse, Request};
use lambda_runtime::{error::HandlerError, Context};
use log::{self, info};
use simple_logger;
use std::error::Error;

fn main() -> Result<(), Box<dyn Error>> {
    simple_logger::init_with_level(log::Level::Debug)?;
    info!("Starting up...");
    lambda!(handler);

    return Ok(());
}

fn handler(req: Request, ctx: Context) -> Result<impl IntoResponse, HandlerError> {
    Ok(format!("{}", req.headers()).into_response())
}
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以转换req.headers()为 JSON 并返回?

She*_*ter 6

没有“正确”的方法可以做到这一点。就像没有自动实现Display结构的“正确”方法一样,没有一种真正的方法可以将某些数据序列化为 JSON。

如果您只需要获得一些可以算作 JSON 的东西,并且由于这是用于调试,那么我只需打印出标题的调试形式,然后将其转换为Value

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()
}
Run Code Online (Sandbox Code Playgroud)

如果你想要更结构化的东西,你可以(有损!)将标题转换为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
}
Run Code Online (Sandbox Code Playgroud)