我有这样一个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()对迭代器.

  • 在上面调用.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");

请注意,由于.collect()重载,因此需要在hash_query上添加类型注释,因此必须告诉编译器需要哪种集合类型.

如果需要处理重复或重复的 keys ,请try 使用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相关问答推荐

使用nom将任何空白、制表符、白线等序列替换为单个空白

在actix—web中使用Redirect或NamedFile响应

关联类型(类型参数)命名约定

如何对字符串引用的引用向量进行排序,而不是对最外层的引用进行排序?

在跨平台应用程序中使用std::OS::Linux和std::OS::Windows

告诉Rust编译器返回值不包含构造函数中提供的引用

rust中的库插件管理器,现在是否可行?

Rust面向对象设计模式

如何设置activx websocket actorless的消息大小限制?

Windows 上 ndarray-linalg 与 mkl-stats 的链接时间错误

使用 serde::from_value 反序列化为泛型类型

如何将 struct 数组放置在另一个 struct 的末尾而不进行内存分段

如何在Rust中使用Serde创建一个自定义的反序列化器来处理带有内部标记的枚举

如何为已实现其他相关 std trait 的每个类型实现一个 std Trait

枚举的利基优化如何在 Rust 中工作?

切片不能被 `usize` 索引?

如何在 use_effect_with_deps 中设置监听器内的状态?

如何在 nom 中构建负前瞻解析器?

如何为枚举中的单个或多个值返回迭代器

传递 Option<&mut T> 时何时需要 mut