2010-03-28 17 views
12

Estoy tratando de resolver dos URI, pero no es tan sencillo como me gustaría.Java URI.resolve

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

El problema es que ahora es a.resolve(b).toString()"http://www.foo.combar.html". ¿Cómo puedo salirme con eso?

+0

¿Cuál fue el resultado que esperabas? –

+0

"http://www.foo.com/bar.html" hubiera estado bien. – Cpa

+0

¿Por qué usa dos URI? Debe haber una razón, pero no está claro. –

Respuesta

23

Suena como es probable que desee utilizar el URL en lugar de URI (que es más general y tiene que lidiar con una sintaxis menos estrictas.)

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" 

toString de URI() no se comporta como se podría esperar , pero dada su naturaleza general, es posible que deba ser perdonado.

Lamentablemente, el método toURL() de URI no se comporta del todo como yo esperaba para darle lo que desea.

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

Así que es mejor sólo para empezar directamente con una URL para obtener lo que desea:

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 para enfatizar la distinción entre URI y URL – skaffman

2

Aceptar, aparece desde deffinition URL scheme://domain:port/path?query_string#fragment_id no debería ser de 3 barras antes de trayectoria (dos después esquema y uno directamente antes de la ruta)
2 situación puede ocurrir:

    hay 3 barras en su URI => cada cosa está bien
    hay menos de 3 barras en su URI => es necesario agregar barra al final del URI

no es mi snappet de código:

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 debe contener el separador final ('/'), así resolver de la manera deseada:

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

con URI que se podrían utilizar

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

o

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