2011-11-25 130 views
17

這是服務器的絕對URI:如何在Java中「合併」兩個URI?

URI base = new URI("http://localhost/root?a=1"); 

這是一個相對的URI:

URI rel = new URI("/child?b=5"); 

現在我試圖相對一個適用於絕對和接收:

URI combined = base + rel; // somehow 
assert combined.equals(new URI("http://localhost/root/child?a=1&b=5")); 

是否可以使用JDK或某個庫進行這樣的操作?

+2

我期望結果是'http:// localhost/child?b = 5',因爲以斜槓開頭的相對路徑是相對於主機的(即使斜槓不在那裏, 「根」位將被替換以及查詢字符串)。 –

+0

@SimonRichter是有道理的,我準備好刪除斜線,只是讓我知道如何完成合並:) – yegor256

+0

在參數衝突的情況下會發生什麼,例如, 'root?a = 1'和'child?a = 5'? 'a = 1'或'a = 5'? – home

回答

17
URL mergedURL = new URL(new URL(baseUrl), relativeUrl); 

審議通過關於基本URL的參數,以合併的網址,你必須通過調用URL#getQuery手動提取它們,並將它們添加到新的URL

喜歡的東西,

String finalUrl = mergedUrl.toString() + "&" + baseUrl.getQuery(); 

這將需要一個if()來決定是否需要'&'來加入它們,具體取決於mergedUrl的樣子。

+2

這就是'URI#resolve()'也在做什麼(並且不符合OP的要求,另請參閱對該問題的評論)。請注意,'URI'有一個'toURL()'方法(從另一端開始,'URL'有'toURI()'方法)。 – BalusC

+0

其實這個方法非常接近我要找的東西。這裏唯一的問題是查詢參數在根中被銷燬,並且輸出是:'http:// localhost/root/child?b = 5' – yegor256

+0

真的嗎?在我的情況下,它也省略了'/ root'。 – BalusC

0

醜陋,但是作品,在這種情況下,至少:

URI combined = new URI("http://" + base.getHost() + base.getPath() + rel.getPath() + "?" + base.getQuery() + "&" + rel.getQuery()); 

要求,使第二相對於第一,其中第一個具有查詢字符串的URL,是有點奇怪。第二個URL以'/'開頭,這意味着它相對於「/」,而不是「/ root」...你確定關於結果URL嗎?

+6

你的代碼行令人討厭 –

+0

確實。這就是爲什麼我不得不質疑這些要求。這種卷積通常是我試圖做錯事的跡象... –

+1

我試圖想出一些不錯的東西,但它導致了至少兩個JAR依賴和〜6行代碼... –

2

URI(和文件也)有一個構造函數接受現有的URI(或文件)。
它是由相對的URI:
URL mergedURL = new URL(baseUrl, relativeUrl);
要合併兩個文件路徑,你可以使用:
File mergedFile = new File(directoryFile, fileOrDir);
如果使用mergedFile.getName()你得到的文件名,如果它不是一個目錄。
這不適用於URL。