Как "объединить" два URI в Java?
Это абсолютный URI сервера:
URI base = new URI("http://localhost/root?a=1");
Это относительный URI:
URI rel = new URI("/child?b=5");
Теперь я пытаюсь применить относительный к абсолюту и получать:
URI combined = base + rel; // somehow
assert combined.equals(new URI("http://localhost/root/child?a=1&b=5"));
Возможно ли такое манипулирование с JDK или некоторой библиотекой?
Ответы
Ответ 1
URL mergedURL = new URL(new URL(baseUrl), relativeUrl);
Чтобы передать базовые параметры URL-адреса для объединенного URL-адреса, вам придется извлекать их вручную, вызывая URL-адреС# getQuery и добавляя их к новому URL
Что-то вроде,
String finalUrl = mergedUrl.toString() + "&" + baseUrl.getQuery();
Потребуется if(), чтобы решить, будет ли '&' требуется присоединиться к ним в зависимости от того, как выглядит mergedUrl.
Ответ 2
URI (и файл также) имеют конструктор, который принимает существующий URI (или файл).
Это сделано для относительных URI:
URL mergedURL = new URL(baseUrl, relativeUrl);
Чтобы объединить два пути к файлу, вы можете использовать:
File mergedFile = new File(directoryFile, fileOrDir);
Если вы используете mergedFile.getName()
, вы получите имя файла, если оно не является каталогом.
Это невозможно для URL-адреса.
Ответ 3
Уродливо, но работает, по крайней мере, в этом случае:
URI combined = new URI( "http://" + base.getHost() + base.getPath() + rel.getPath() + "?" + base.getQuery() + "&" + rel.getQuery() );
Требование сделать второй URL-адрес относительно первого, где первый имеет строку запроса, является бит нечетным. И второй URL начинается с "/", что подразумевает его относительно "/", а не "/root"... вы уверены в результирующем URL?