Как "объединить" два URI в Java? - программирование
Подтвердить что ты не робот

Как "объединить" два 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 или некоторой библиотекой?

4b9b3361

Ответ 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?