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. Посмотрите документацию, у вас будет более четкое представление об этом.

Другие вопросы по тегам