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"
. Как мне это избежать?
Ответы
Ответ 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 может произойти:
- в вашем 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);
Ответ 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);