如何解码URL并将查询字符串作为HashMap?

Sae*_* M. 7 parse-url query-string rust

我有这样的网址:

http%3A%2F%2Fexample.com%3Fa%3D1%26b%3D2%26c%3D3
Run Code Online (Sandbox Code Playgroud)

我解析它hyper::Url::parse并获取查询字符串:

let parsed_url = hyper::Url::parse(&u).unwrap();
let query_string = parsed_url.query();
Run Code Online (Sandbox Code Playgroud)

但它给了我一个字符串的查询.我想获取查询字符串HashMap.这样的事情:

// some code to convert query string to HashMap
hash_query.get(&"a"); // eq to 1
hash_query.get(&"b"); // eq to 2
Run Code Online (Sandbox Code Playgroud)

Lam*_*iry 10

涉及几个步骤:

  • .query_pairs()方法将为您提供一对迭代器Cow<str>.

  • 调用.into_owned()它会给你一String对迭代器而不是对.

  • 这是一个迭代(String, String),这是完全正确的形状,以.collect()HashMap<String, String>.

把它放在一起:

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");
Run Code Online (Sandbox Code Playgroud)

请注意,在hash_query-since .collect()重载时需要类型注释,您必须告诉编译器您想要哪种集合类型.

  • 请注意,这会覆盖重复的密钥.许多Web框架利用了您可以多次提交相同密钥的事实. (5认同)
  • 请注意,如果您只有一个查询字符串,而不是一个完整的URL,那么您可以使用[`url :: form_urlencoded :: parse()`](https://docs.rs/url/1.4.0/url/form_urlencoded /fn.parse.html)而不是. (4认同)
  • @tworec以保留重复的密钥,将`HashMap &lt;_,_&gt;`更改为`Vec &lt;_&gt;` (2认同)