2011-11-25 5 views
17

これは、サーバーの絶対URIである:Javaで2つのURIを「マージする」方法

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

これは相対URIである:

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

は今、私は絶対に比べて1つを適用し、受信しようとしています:

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

JDKやライブラリでこのような操作を行うことはできますか?あなたはURL#getQueryを呼び出すことによって手動で抽出し、新しいURLに同様

何かをそれらを追加する必要があります、マージされたURLにベースURLのパラメータを渡すために

+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); 

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

mergedUrlのように、 '&'が参加する必要があるかどうかを判断するにはif()が必要です。

+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を相対にする要件は、少し奇妙です。 2番目のURLは「/」に始まり、「/」には相対しないことを意味する「/」で始まります。結果のURLについて確信していますか?

+6

あなたのコード行は厄介です –

+0

確かに。だからこそ私は要件に疑問を呈した。この種の畳み込みは、通常、私が間違ったことをしようとしている兆候です... –

+1

何か素敵なものを考え出しましたが、少なくとも2つのJAR依存関係と〜6行のコードが作成されました... –

2

URI(およびファイル)には、既存のURI(またはファイル)を受け入れるコンストラクタがあります。
は、相対URIのために作られている:
URL mergedURL = new URL(baseUrl, relativeUrl);
あなたが使用できる2つのファイルのパスをマージするには:
File mergedFile = new File(directoryFile, fileOrDir);
あなたがmergedFile.getName()を使用している場合は、それがディレクトリではない場合は、ファイル名を取得します。
これはURLでは不可能です。

関連する問題