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

标签 rust query-string parse-url

我有一个这样的 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/

相关文章:

rust - 如何将特征与使用特征关联类型作为参数的超特征绑定(bind)?

C 查询字符串解析

post - 如何使用查询字符串参数制作 Guzzle 帖子

.htaccess - htaccess QUERY_STRING urldecode

php - parse_url() PHP 工作异常

rust - 解决通过引用获取参数的闭包的类型不匹配

rust - 错误 E0412:导入 tokio::sync 时使用未声明的 crate 或模块 `tokio`

rust - 从 lint 中找出 crate 的当前版本?

php - 当参数之一是 url 时的 parse_url() 问题

PHP - 如何获取没有值的 $_GET 参数