在Rust中将HTTP请求标头(http::HeaderMap
)序列化为JSON的正确方法是什么?
我正在实现AWS Lambda函数,我希望有一个简单的echo函数用于调试。
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())
}
有没有一种简单的方法将req.headers()
转换为JSON并返回?
没有“适当”的方法这样做。就像没有“适当”的方法来自动为结构体实现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()
}
如果你想要更结构化的东西,你可以(有点!)将标题转换为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
}