2010-03-28 19 views
12

J'essaie de résoudre deux URI, mais ce n'est pas aussi simple que je le voudrais.Java URI.resolve

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

Le problème est que a.resolve(b).toString() est maintenant "http://www.foo.combar.html". Comment puis-je m'en tirer avec ça?

+0

Quelle a été la sortie que vous attendiez? –

+0

"http://www.foo.com/bar.html" aurait été bien. – Cpa

+0

Pourquoi utilisez-vous deux URI? Il doit y avoir une raison, mais ce n'est pas clair. –

Répondre

23

On dirait que vous voulez probablement utiliser URL plutôt que URI (qui est plus général et doit faire face à une syntaxe moins stricte.)

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() ne se comporte pas comme vous pouvez attendre , mais étant donné sa nature générale, il se peut qu'il soit pardonné. Malheureusement, la méthode toURL() de URI ne se comporte pas comme j'aurais souhaité vous donner ce que vous voulez.

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

donc mieux que de commencer directement avec une URL pour obtenir ce que vous voulez:

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 pour souligner la distinction entre URI et URL – skaffman

2

Ok, apparaît depuis l'URL deffinition scheme://domain:port/path?query_string#fragment_id il devrait y avoir 3 barres obliques avant chemin (deux après schéma et un directement avant le chemin)
2 situation peut se produire:

    il y a 3 barres obliques dans votre URI => chaque chose est OK
    il y a moins de 3 barres obliques dans votre URI => vous devez ajouter slash à la fin de l'URI

il est mon snappet de code:

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 doit contenir le séparateur final ('/') et de résoudre la façon dont vous voulez:

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

Avec URI vous pouvez utiliser

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

ou

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