【Rust】フレームワーク自作: jsonも扱えるようにする

let content_type = request
        .lines()
        .find(|line| line.to_ascii_lowercase().starts_with("content-type:"))
        .unwrap_or("");
    let is_json = content_type.contains("application/json");
//

pub fn parse_json(body: &str) -> Option<HashMap<String, String>> {
    let parsed: Result<Value, _> = serde_json::from_str(body);
    match parsed {
        Ok(Value::Object(map)) => {
            let mut result = HashMap::new();
            for (k, v) in map {
                if let Some(s) = v.as_str() {
                    result.insert(k, s.to_string());
                } else {
                    result.insert(k, v.to_string()); // fallback
                }
            }
            Some(result)
        }
        _ => None,
    }
}

jsonデータの場合は、parse_jsonとしてdataを利用する。

fn handle_api_post(_req: &str, body: String) -> HttpResponse {
    let data = parse_json(&body).unwrap_or_default();

    let binding = "<unknown>".to_string();
    let name = data.get("name").unwrap_or(&binding);
    let message = format!("{{\"greeting\": \"Hello, {}!\"}}", name);

    let mut response = HttpResponse::new(200, &message);
    response.headers.insert("Content-Type".to_string(), "application/json".to_string());
    response
}

なるほどー