Вопрос по java – java.net.URI разрешает только строку запроса

4

Я пытаюсь создать URI, используя JDK Java.net.URI.
Я хочу добавить к абсолютному объекту URI запрос (в строке). В примере:

<code>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);
</code>

Теория (или то, что я думаю) заключается в том, что решимость должна вернуться:

<code>http://example.com/something/more/long?query=http://local:282/rand&action=aaaa
</code>

Но вот что я получил:

<code> http://example.com/something/more/?query=http://local:282/rand&action=aaaa
</code>

Зачем#разрешить( "ест" последний путь? Если новый URI query) построен как:

<code>URI query = new URI(null, null, base.getPath(), queryString, null);
</code>

Это работает хорошо

проверить это - / Stackoverflow.com вопросы / 2793150 / ... Subhrajyoti Majumder

Ваш Ответ

2   ответа
4

к URI # решительность () говорит, в разделе 3.b.

Иначе путь заданного URI является относительным, и поэтому путь нового URI вычисляется путем разрешения пути данного URI относительно пути этого URI. Это делается путем объединения всех, кроме последнего сегмента пути этого URI, если таковые имеются, с указанным путем URI, а затем нормализации результата, как будто путем вызова метода normalize.

Так .... я не правильно прочитал. Должен ли я удалить этот ответ? Или пусть ответит сам?

Документация понятна, но какова мотивация? Зачем удалять последний сегмент? Gaëtan Sheridan
Это явно противоречит спецификации WHATWG URL: Url.spec.whatwg.org / # относительное состояние, к сожалению, было сообщение об ошибке по этой проблеме: Bugs.java.com / bugdatabase / view_bug.do? Bug_id = 6519518 и разрешение "Не исправлю", потому что - наследие. Guss
Я создал сообщение об ошибке противURI класс здесь: Bugs.java.com / bugdatabase / view_bug.do? Bug_id = JDK-8218962 В системе отслеживания ошибок Oracle нет функции комментирования сообществом, но, по крайней мере, мы можем отслеживать прогресс в этом вопросе. Guss
1

Первый случай:

а также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());
        }

where cp - дочерний элемент (в вашем случае путь запроса). В качестве значения здесь null поток переходит в цикл else, где разрешенному запросу является назначенный путь от базового URI.

Ваш новый URI имеет этот путь/something/more/, поскольку он удаляет все после последнего символа "/".

Второй случай:

base =http: //example.com/something/more/lon а такжеquery оценивается как

query = /something/more/long?query=http://local:282/rand&action=aaaa

Здесь идет цикл if, который назначает путь запроса новому пути URI. Путь вашего URI запроса -/something/more/long здесь, т. е. оно также включает в себя значение "long". Может быть, именно так они разрешают URI. Посмотрите документацию, у вас будет более четкое представление об этом.

"если" - это не цикл. immibis

Похожие вопросы