2011-11-25 22 views
17

Este es un URI absoluto del servidor:¿Cómo "fusionar" dos URI en Java?

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

Este es un URI relativa:

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

Ahora estoy tratando de aplicar una relativa a la absoluta y recibir:

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

¿Es posible hacer tal manipulación con JDK o alguna biblioteca?

+2

Espero que el resultado sea 'http: // localhost/child? B = 5', ya que una ruta relativa que comienza con una barra inclinada es relativa al host (e incluso si la barra no estaba allí, el el bit "raíz" se reemplazará, así como la cadena de consulta). –

+0

@SimonRichter tiene sentido, estoy listo para eliminar la barra, solo déjame saber cómo lograr la fusión :) – yegor256

+0

Lo que debería suceder en caso de conflicto de parámetros, p. 'root? a = 1' y' child? a = 5'? 'a = 1' o' a = 5'? – home

Respuesta

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

para transmitir parámetros de URL de base a url fusionada, que tendrá que extraer manualmente llamando URL # getQuery y los añade a la nueva URL

Algo así como,

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

Se necesitará un if() para decidir si se necesita un '&' para unirlos dependiendo de cómo se vea mergedUrl.

+2

Eso es efectivamente lo que 'URI # resolve()' también está haciendo (y no coincide con los requisitos de OP, vea también los comentarios sobre la pregunta). Tenga en cuenta que 'URI' tiene un método' toURL() '(y desde el otro lado,' URL' tiene un método 'toURI()'). – BalusC

+0

En realidad, este método está muy cerca de lo que estoy buscando. El único problema aquí es que los parámetros de consulta se destruyen en la raíz, y la salida es: 'http: // localhost/root/child? B = 5' – yegor256

+0

¿De verdad? En mi caso, omite '/ root' también. – BalusC

0

feo, pero funciona, en este caso al menos:

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

El requisito para hacer la segunda dirección URL relativa a la primera, donde el primero tiene una cadena de consulta, es un poco extraño. Y la segunda URL comienza con un '/' que implica que es relativo a "/", no a "/ raíz" ... ¿está seguro de la URL resultante?

+6

su línea de código es desagradable –

+0

De hecho. Es por eso que tuve que cuestionar los requisitos. Este tipo de convolución suele ser una señal de que estoy tratando de hacer algo incorrecto ... –

+1

Traté de encontrar algo bueno, pero resultó en al menos dos dependencias JAR y ~ 6 líneas de código ... –

2

URI (y también archivo) tienen un constructor que acepta un URI (o archivo) existente.
Está hecho para URI relativo de:
URL mergedURL = new URL(baseUrl, relativeUrl);
Para combinar dos rutas de archivos que puede utilizar:
File mergedFile = new File(directoryFile, fileOrDir);
Si utiliza mergedFile.getName() que presentamos lo mejor el nombre del archivo si no es un directorio.
Esto no es posible para una URL.