Как сериализовать http :: HeaderMap в JSON? - PullRequest
0 голосов
/ 12 апреля 2019

Как правильно сериализовать заголовки HTTP-запроса (http::HeaderMap) в JSON в Rust?

Я реализую функцию 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())
}

Есть ли простой способ конвертировать req.headers() в JSON и вернуть?

1 Ответ

2 голосов
/ 12 апреля 2019

Не существует «правильного» способа сделать это. Так же, как не существует «правильного» способа автоматической реализации 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...