2010-03-28 12 views
12

Próbuję rozwiązać dwa URI, ale nie jest to tak proste, jak bym chciał.Java URI.resolve

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

Problem jest to, że a.resolve(b).toString() jest teraz "http://www.foo.combar.html". Jak mogę temu uciec?

+0

Co było wyjście pan spodziewa? –

+0

"http://www.foo.com/bar.html" byłby w porządku. – Cpa

+0

Dlaczego używasz dwóch identyfikatorów URI? Musi być jakiś powód, ale nie jest to jasne. –

Odpowiedz

23

Brzmi prawdopodobnie chcesz użyć URL zamiast URI (co jest bardziej ogólne i potrzebuje do czynienia z mniej ścisłym składni.)

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() nie zachowuje się jak można się spodziewać , ale biorąc pod uwagę jego ogólny charakter, być może należy mu wybaczyć.

Niestety metoda toURL() URI nie zachowuje się tak, jak bym chciała dać ci to, co chcesz.

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

więc najlepiej po prostu zacząć prosto z adresem URL, aby uzyskać to, co chcesz:

URL x = new URL("http://www.foo.com"); 
URL y = new URL(x, "bar.html"); 
y.toString() -> "http://www.foo.com/bar.html" 
+1

+1 w celu podkreślenia rozróżnienia między identyfikatorem URI a adresem URL – skaffman

2

Ok, wynika z URL deffinition scheme://domain:port/path?query_string#fragment_id nie powinno być 3 ukośniki przed ścieżką (dwa po Schemat i jeden bezpośrednio przed ścieżką). Może wystąpić sytuacja:

    W identyfikatorze URI występują 3 ukośniki => co rzeczą jest OK
    istnieje mniej niż 3 ukośniki w swojej URI => trzeba dodać ukośnik na końcu URI

jest moja snappet kodu:

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

URI powinien zawierać końcowy separator ('/'), jak również rozwiązać tak, jak chcesz:

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

z URI można użyć

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

lub

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