Java URI.resolve - PullRequest
       13

Java URI.resolve

14 голосов
/ 28 марта 2010

Я пытаюсь разрешить два URI, но это не так просто, как хотелось бы.

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

Беда в том, что a.resolve(b).toString() теперь "http://www.foo.combar.html". Как мне это сойти с рук?

Ответы [ 3 ]

28 голосов
/ 29 марта 2010

Похоже, вы, вероятно, хотите использовать URL, а не URI (который является более общим и требует менее строгого синтаксиса.)

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 () не ведет себя так, как вы могли бы ожидать, но, учитывая его общую природу, он может быть прощен.

К сожалению, метод toURL () в URI работает не совсем так, как я хотел бы дать вам то, что вы хотите.

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"
5 голосов
/ 16 августа 2011

URI также должен содержать конечный разделитель ('/') для разрешения того, как вы хотите:

URI a = new URI("http://www.foo.com/");
2 голосов
/ 22 марта 2011

Хорошо, появляется из определения URL-адреса. схема: // домен: порт / путь? до пути должно быть 3 слеша (два после схемы и один непосредственно перед путем)
Может возникнуть 2 ситуации:

есть мой код:

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