22

2 つの URI を解決しようとしていますが、思ったほど簡単ではありません。

URI a = new URI("http://www.foo.com");
URI b = new URI("bar.html");

問題は、それa.resolve(b).toString()が今だということです"http://www.foo.combar.html"。どうすればそれを回避できますか?

4

5 に答える 5

30

おそらくURIではなくURLを使用したいようです(より一般的であり、厳密でない構文を扱う必要があります)。

URI a = new URI("http://www.foo.com");
URI b = new URI("bar.html");
URI c = a.resolve(b);
c.toString()     -> "http://www.foo.combar.html"
c.getAuthority() -> "www.foo.com"
c.getPath()      -> "bar.html"

URI の toString() は期待どおりに動作しませんが、その一般的な性質を考えると、許されるべきかもしれません。

悲しいことに、URI の toURL() メソッドは、あなたが望むものを提供することを望んでいたようには動作しません。

URL u = c.toURL();
u.toString()     -> "http://www.foo.combar.html"
u.getAuthority() -> "www.foo.combar.html"  --- Oh dear :(

したがって、必要なものを取得するには、URL から直接開始するのが最善です。

URL x = new URL("http://www.foo.com");
URL y = new URL(x, "bar.html");
y.toString() -> "http://www.foo.com/bar.html"
于 2010-03-28T23:34:32.350 に答える
8

URI には、必要な方法で解決するために、最後の区切り記号 ('/') も含める必要があります。

URI a = new URI("http://www.foo.com/");
于 2011-08-16T15:19:47.060 に答える
2

OK、URL 定義から表示されますscheme://domain:port/path?query_string#fragment_id パスの前に 3 つのスラッシュが必要です (スキームの後に 2 つ、パスの直前に 1 つ)
2 つの状況が発生する可能性があります。

    URI に 3 つのスラッシュがあります => すべて問題ありません
    URI のスラッシュが 3 つ未満です => URI の末尾にスラッシュを追加する必要があります

私のコードのスナペットがあります:

String url = "http://www.foo.com";
String endSlash="";
int indexOfSlash = 0;
for(int i = 0;i<3;i++){
   int nextIndex = url.indexOf('/',indexOfSlash);
   if(!(nextIndex>0)){
      if(i>1){
         endSlash="/";
      }else{
         throw new MalformedURLException("Bad given url format, mising :// after schema");
      }
   }else{
      indexOfSlash = ++nextIndex;
   }
}
URL rightUrl = new URL(url+endSlash);
于 2011-03-22T14:52:55.617 に答える