java.net.URI разрешает только строку запроса
Я пытаюсь создать URI, используя JDK java.net.URI.
Я хочу добавить к абсолютному объекту URI, запрос (в строке). В примере:
URI base = new URI("http://example.com/something/more/long");
String queryString = "query=http://local:282/rand&action=aaaa";
URI query = new URI(null, null, null, queryString, null);
URI result = base.resolve(query);
Теория (или то, что я думаю) заключается в том, что решимость должна вернуться:
http://example.com/something/more/long?query=http://local:282/rand&action=aaaa
Но то, что я получил, это:
http://example.com/something/more/?query=http://local:282/rand&action=aaaa
Почему #resolve () "ест" последний путь? Если новый URI (query
) построен как:
URI query = new URI(null, null, base.getPath(), queryString, null);
Это работает хорошо.
2 ответа
Я хотел бы ответить сам. Javadoc действительно объясняет правильно. Как говорится в URI#resolv (), в разделе 3.b.:
В противном случае путь данного URI является относительным, и поэтому путь нового URI вычисляется путем разрешения пути данного URI относительно пути этого URI. Это делается путем объединения всех, кроме последнего сегмента пути этого URI, если таковые имеются, с указанным путем URI, а затем нормализации результата, как будто путем вызова метода normalize.
Так что.... я не правильно прочитал. Должен ли я удалить этот ответ? Или пусть ответит сам?
Первый случай:
base = http://example.com/something/more/long
а также query
оценивает быть
query = ?query=http://local:282/rand&action=aaaa.
Согласно документации метода public URI resolve(URI uri)
, он разрешает URI запроса к базовому URI. При разрешении, если метод находит путь в URI запроса, он назначает этот же путь новому разрешенному URI. В этом случае нет пути, связанного с query
, Если вы видите приведенный ниже фрагмент resolve()
функция, это станет более понятным.
// сниппет
String cp = (child.path == null) ? "" : child.path;
if ((cp.length() > 0) && (cp.charAt(0) == '/')) {
// 5.2 (5): Child path is absolute
ru.path = child.path;
} else {
// 5.2 (6): Resolve relative path
ru.path = resolvePath(base.path, cp, base.isAbsolute());
}
где cp - дочерний элемент (в вашем случае путь запроса). Как его ноль здесь, поток входит в цикл else, где разрешенному запросу является назначенный путь от базового URI.
Ваш новый URI имеет этот путь /something/more/
, так как он удаляет все после последнего символа "/".
Второй случай:
base = http://example.com/something/more/long and query
оценивает быть
query = /something/more/long?query=http://local:282/rand&action=aaaa
Здесь речь идет о цикле if, который назначает путь запроса новому пути URI. Путь URI вашего запроса: /something/more/long
здесь, то есть включает в себя и "длинное" значение. Может быть, именно так они разрешают URI. Посмотрите документацию, у вас будет более четкое представление об этом.