Подтвердить что ты не робот

Java URI.resolve

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

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

Проблема в том, что a.resolve(b).toString() теперь "http://www.foo.combar.html". Как мне это избежать?

4b9b3361

Ответ 1

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

Унылый метод 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"

Ответ 2

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

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

Ответ 3

Хорошо, появляется из URL deffinition схема://domain: port/path? query_string # fragment_id перед трактом должно быть 3 слэша (два по схеме и один непосредственно перед трактом)
2 может произойти:

  1. в вашем URI есть 3 слэша = > все в порядке
  1. в вашем 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);

Ответ 4

С помощью URI вы можете использовать

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

или

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