我有一个这样的 URL:
http%3A%2F%2Fexample.com%3Fa%3D1%26b%3D2%26c%3D3
我用 hyper::Url::parse
解析它并获取查询字符串:
let parsed_url = hyper::Url::parse(&u).unwrap();
let query_string = parsed_url.query();
但它以字符串形式向我提供了查询。我想将查询字符串作为 HashMap
。像这样:
// some code to convert query string to HashMap
hash_query.get(&"a"); // eq to 1
hash_query.get(&"b"); // eq to 2
最佳答案
有几个步骤:
.query_pairs()
方法将为您提供一个迭代器Cow<str>
对.调用
.into_owned()
上面会给你一个迭代器String
相反。这是
(String, String)
的迭代器,这正是.collect()
的正确形状进入HashMap<String, String>
.
综合:
use std::collections::HashMap;
let parsed_url = Url::parse("http://example.com/?a=1&b=2&c=3").unwrap();
let hash_query: HashMap<_, _> = parsed_url.query_pairs().into_owned().collect();
assert_eq!(hash_query.get("a"), "1");
请注意,您需要在 hash_query
上添加类型注释—因为.collect()
重载了,你必须告诉编译器你想要哪种集合类型。
如果您需要处理重复或重复的键,请尝试 multimap
crate :
use multimap::MultiMap;
let parsed_url = Url::parse("http://example.com/?a=1&a=2&a=3").unwrap();
let hash_query: MultiMap<_, _> = parsed_url.query_pairs().into_owned().collect();
assert_eq!(hash_query.get_vec("a"), Some(&vec!["1", "2", "3"]));
关于rust - 如何解码 URL 并将查询字符串作为 HashMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43272935/