Rust Iron框架获取URL参数遇路由空值与params::Value格式化问题咨询
问题1:Router取不到query参数的原因
Iron Router 扩展仅用于获取路由路径参数,即你在路由规则中定义的占位符参数,例如router.get("/page/:param", ...)路由规则里的:param。你访问的site/page?param=0中?后的部分是查询字符串,不属于路由路径参数,因此Router的map为空属于正常现象,使用Params插件处理是正确的方案。
问题2:params::Value格式化去引号/类型转换方案
params::Value是枚举类型,包含了字符串、数字、布尔等多种参数类型的变体,你需要先取出枚举内部的原生值再格式化,即可避免Debug输出带引号的问题,同时满足Display trait的要求。
方案1:参数为数字类型(对应你的输出示例)
直接取出数值类型即可用{}格式化,无额外引号:
let function = move |req: &mut Request| -> IronResult<Response> { use params::{Params}; use crate::iron::Plugin; let map = req.get_ref::<Params>().unwrap(); // 取无符号整数用as_u64,有符号用as_i64,浮点数用as_f64 let val1 = map.find(&["param1"]).and_then(|v| v.as_u64()).expect("param1 must be a valid number"); let val2 = map.find(&["param2"]).and_then(|v| v.as_u64()).expect("param2 must be a valid number"); let cmd = format!("cmd={},{}\n", val1, val2); println!("{}", cmd); // 其余逻辑 Ok(Response::with(iron::status::Ok)) };
方案2:参数为字符串类型
取出字符串切片即可正常格式化:
let val1 = map.find(&["param1"]).and_then(|v| v.as_str()).expect("param1 is required"); let val2 = map.find(&["param2"]).and_then(|v| v.as_str()).expect("param2 is required"); let cmd = format!("cmd={},{}\n", val1, val2);
兼容多种参数类型的写法
如果不能确定参数传入的类型,可以用match匹配处理所有可能的变体:
let val1 = match map.find(&["param1"]) { Some(params::Value::String(s)) => s, Some(params::Value::U64(n)) => &n.to_string(), Some(params::Value::I64(n)) => &n.to_string(), _ => panic!("param1 类型不合法"), };
内容的提问来源于stack exchange,提问作者pavel levitsky
相关产品推荐
相关产品推荐

