2012-04-26 50 views
3

java.net.URI中的決心,我想URI的使用JDK java.net.URI建設。
我要附加到絕對URI對象,查詢(在字符串)。在例如:只針對查詢字符串

URI base = new URI("http://example.com/something/more/long"); 
String queryString = "query=http://local:282/rand&action=aaaa"; 
URI query = new URI(null, null, null, queryString, null); 
URI result = base.resolve(query); 

理論(或者是什麼,我認爲)是這種決心應該返回:

http://example.com/something/more/long?query=http://local:282/rand&action=aaaa 

但我得到的是:

http://example.com/something/more/?query=http://local:282/rand&action=aaaa 

爲什麼#resolve() 「吃」 最後的路徑?如果新的URI(query)被構建爲:

URI query = new URI(null, null, base.getPath(), queryString, null); 

它運作良好。

+0

檢查這一個 - http://stackoverflow.com/questions/2793150/how-to-use-java-net-urlconnection-to-fire-and-handle-http-requests – 2012-04-26 09:43:14

回答

3

我想對自己作出迴應。 Javadoc真正解釋正確。作爲URI#resolve()說,在第3.B:

否則,給定URI的路徑是相對的,因此新的URI路徑 通過解析給定的URI的反對 此URI路徑的路徑計算。這是通過連接(如果有)所有,但 此URI的路徑的最後一段完成的,與給定的URI路徑,然後 通過調用標準化的方法標準化的結果彷彿。

所以....我沒有正確讀取。我應該刪除這個迴應嗎?還是讓它自己迴應?

1

第一種情況:

base = http://example.com/something/more/long 

query和計算結果爲是

query = ?query=http://local:282/rand&action=aaaa. 

根據方法public URI resolve(URI uri)的文檔,它解析查詢URI靠基部URI。在解析該方法是否在查詢URI中找到路徑時,它會將相同的路徑分配給新解析的URI。在這種情況下,沒有與query相關的路徑。如果你看到resolve()功能的下面片段,它會變得更加清晰。

//片斷

String cp = (child.path == null) ? "" : child.path; 
     if ((cp.length() > 0) && (cp.charAt(0) == '/')) { 
     // 5.2 (5): Child path is absolute 
     ru.path = child.path; 
     } else { 
     // 5.2 (6): Resolve relative path 
     ru.path = resolvePath(base.path, cp, base.isAbsolute()); 
     } 

其中cp是孩子(在你的情況下,查詢路徑)。由於其值爲空,流將進入else循環,其中解析的查詢是從基本URI分配的路徑。

你的新的URI有這個路徑/something/more/,因爲它去掉最後一個「/」字符後的一切。

第二種情況:

基地= http://example.com/something/more/longquery評估是

query = /something/more/long?query=http://local:282/rand&action=aaaa 

這轉到如果環路指定查詢路徑,以新的URI的路徑。查詢URI的路徑爲/something/more/long,即包含「long」值。可能這是他們解析URI的方式。仔細查看文檔,你會對它有一個更清晰的概念。

+0

「如果」不是一個循環。 – immibis 2016-02-08 20:43:22