#http #rust
#http #Ржавчина #aws-sdk-rust
Вопрос:
Каков правильный способ сериализации заголовков HTTP-запросов ( http::HeaderMap
) в JSON в Rust?
Я реализую функцию 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 и вернуть?
Комментарии:
1. Итак, вам все равно, какой формат возвращаемого JSON? До тех пор, пока это что-то, что считается JSON?
Ответ №1:
Для этого нет «правильного» способа. Точно так же, как нет «правильного» способа автоматической реализации Display
для структуры, нет ни одного верного способа сериализовать некоторую часть данных в JSON.
Если все, что вам нужно, это получить что-то, что считается JSON, и поскольку это для отладки, я бы просто распечатал отладочную форму заголовков, а затем преобразовал ее в Value
:
use http::{header::HeaderValue, HeaderMap}; // 0.1.17
use serde_json; // 1.0.39
fn convert(headers: amp;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: amp;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
}