2017-04-07 81 views
2

我有這樣一個URL:如何解碼一個URL,並獲得查詢字符串作爲一個HashMap?

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 
+0

如果輸入是'HTTP://示例.com一個= 1&B = 2& C = 3'代替?當它被編碼時,它不是一個有效的URL。 –

回答

4

有涉及幾個步驟:

  • .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"); 

請注意,您需要在hash_query - 由於.collect()類型註釋超載,你必須告訴你想要的集合類型的編譯器。

+1

被警告,這將覆蓋重複鍵。許多Web框架都利用了您可以多次提交相同密鑰的事實。 – Shepmaster

+1

注意,如果你只是有一個查詢字符串,而不是一個完整的URL,那麼你可以使用['網址:: form_urlencoded ::解析()'](https://docs.rs/url/1.4.0/url/而是使用form_urlencoded/fn.parse.html)。 –

相關問題