2011-04-29 35 views
1

這種行爲是故意的嗎?Java URI類:構造函數確定查詢是否被編碼?

//create the same URI using two different constructors 

URI foo = null, bar = null; 
try { 
    //constructor: URI(uri string) 
    foo = new URI("http://localhost/index.php?token=4%2F4EzdsSBg_4vX6D5pzvdsMLDoyItB"); 
} catch (URISyntaxException e) {} 
try { 
    //constructor: URI(scheme, authority, path, query, fragment) 
    bar = new URI("http", "localhost", "/index.php", "token=4%2F4EzdsSBg_4vX6D5pzvdsMLDoyItB", null); 
} catch (URISyntaxException e) {} 

//the output: 
//foo.getQuery() = token=4/4EzdsSBg_4vX6D5pzvdsMLDoyItB 
//bar.getQuery() = token=4%2F4EzdsSBg_4vX6D5pzvdsMLDoyItB 

URI(string uri)構造函數似乎是解碼URI的查詢部分。我認爲查詢部分應該被編碼?爲什麼其他構造函數不能解碼查詢部分?

+0

請問你能改正你的格式,讓你的文章更具可讀性嗎? – Thomas 2011-04-29 06:36:19

回答

1

URI JavaDoc

單參數的構造函數需要在它的參數中的任何非法字符被引用,並保留任何轉義八位組和其他字符都存在。

多參數構造函數根據它們出現的組件的要求引用非法字符。百分號字符('%')總是由這些構造函數引用。任何其他字符都將保留。

因此URI(字符串)期望用戶正確編碼的一切,並假定%2F是這樣的編碼octed將被解碼爲/

其他構造將endcode的%字符(導致%252F輸入%2F),因此你解碼後仍然得到%2F

我假設構造函數之間的偏差的目的是允許new URI(otherUri.toString())toString()返回一個完全編碼的URI。

+0

這很有趣。謝謝。我會記得引用Oracle的JavaDoc。 Android參考文獻中的文檔比較少得多。 – mihakase 2011-04-29 06:46:58

0

快速分析:

FOO

構造解析輸入URI和unquotes字面%2F/。這是我們所期望的。

酒吧

在酒吧例中使用的構造方法,所述片段部分被取爲原始字符串非法字符和編碼第一,與%2F被翻譯爲%252F的效果。 然後它被解析並且現在未加引號的查詢部分是(再次)%2F

獲得的經驗:通過第一個構造函數,我們傳遞了符合RFC 2396的URI。其他構造函數採用正常字符串(不加引號的非法字符)和URI構造符合RFC 2396的表示。

Here's a working example on IDEONE (with extra supporting output)

+0

(接收到一個真實生活的'InterruptedException',所以答案有點遲,但我留下了它,因爲ideone鏈接也支持Thomas的答案) – 2011-04-29 06:58:16