2011-11-25 22 views
17

Questo è un URI assoluto del server:Come "unire" due URI in Java?

URI base = new URI("http://localhost/root?a=1"); 

Questo è un URI relativo:

URI rel = new URI("/child?b=5"); 

Ora sto cercando di applicare una relativa alla assoluta e ricevere:

URI combined = base + rel; // somehow 
assert combined.equals(new URI("http://localhost/root/child?a=1&b=5")); 

È possibile eseguire una tale manipolazione con JDK o qualche libreria?

+2

Mi aspetto che il risultato sia 'http: // localhost/child? B = 5', poiché un percorso relativo che inizia con una barra è relativo all'host (e anche se la barra non era presente, il bit "root" verrebbe sostituito così come la stringa di query). –

+0

@SimonRichter ha senso, sono pronto a rimuovere la barra, fammi sapere come eseguire l'unione :) – yegor256

+0

Cosa dovrebbe accadere in caso di conflitto di parametri, ad es. 'root? a = 1' e' child? a = 5'? 'a = 1' o' a = 5'? – home

risposta

17
URL mergedURL = new URL(new URL(baseUrl), relativeUrl); 

di trasmettere i parametri di base di URL a URL risultante dalla fusione, si dovrà estrarre manualmente chiamando URL # getQuery e li aggiunge al nuovo URL

Qualcosa di simile,

String finalUrl = mergedUrl.toString() + "&" + baseUrl.getQuery(); 

Ci vorrà un if() per decidere se è necessario un '&' per unirli a seconda dell'aspetto di mergedUrl.

+2

Questo è anche ciò che sta facendo anche 'URI # resolve()' (e non corrisponde ai requisiti dell'OP, vedere anche i commenti sulla domanda). Si noti che 'URI' ha un metodo' toURL() '(e dall'altra parte,' URL' ha un metodo 'toURI()'). – BalusC

+0

In realtà questo metodo è molto vicino a quello che sto cercando. L'unico problema qui è che i parametri della query vengono distrutti nella radice e l'output è: 'http: // localhost/root/child? B = 5' – yegor256

+0

Davvero? Nel mio caso omette anche il '/ root'. – BalusC

0

brutto, ma le opere, in questo caso, almeno:

URI combined = new URI("http://" + base.getHost() + base.getPath() + rel.getPath() + "?" + base.getQuery() + "&" + rel.getQuery()); 

L'obbligo di fare il secondo URL relativo alla prima, in cui il primo ha una stringa di query, è un po 'strano. E il secondo URL inizia con un '/' che implica che è relativo a "/", non a "/ root" ... sei sicuro dell'URL risultante?

+6

la tua riga di codice è brutta –

+0

Infatti. Ecco perché ho dovuto mettere in discussione i requisiti. Questo tipo di convoluzione è di solito un segnale che sto cercando di fare la cosa sbagliata ... –

+1

Ho cercato di inventare qualcosa di carino, ma ha provocato almeno due dipendenze JAR e ~ 6 righe di codice ... –

2

URI (e anche File) hanno un costruttore che accetta un URI (o File) esistente.
è fatto per URI relativo di:
URL mergedURL = new URL(baseUrl, relativeUrl);
Per unire due percorsi di file è possibile utilizzare:
File mergedFile = new File(directoryFile, fileOrDir);
Se si utilizza mergedFile.getName() si ottiene il nome del file se non è una directory.
Questo non è possibile per un URL.