2015-10-26 10 views
0

new URL(new URL(new URL("http://localhost:4567"), "abc"), "def") Конструкция производит (имхо неправильно) этот URL: http://localhost:4567/defОшибка java.net.URL при построении URL-адресов?

Хотя конструкция new URL(new URL(new URL("http://localhost:4567"), "abc/"), "def") производит правильный (разыскивается меня) URL: http://localhost:4567/abc/def

Разница заключается в косую черту в abc аргумента конструктора.

Это намеренное поведение, или это ошибка, которая должна быть исправлена ​​в классе URL?
В конце концов, идея не стоит беспокоиться о косе, когда вы используете какой-то вспомогательный класс для построения URL-адреса.

+0

Утверждение, что проверенный класс в SDK имеет ошибку, обычно является довольно смелым заявлением. – Kayaman

+0

Я ничего не утверждаю. Просто прошу объяснить это поведение. – George

+0

Ну, вы можете пойти через источники класса 'URL', чтобы узнать, есть ли что-нибудь полезное. Скорее всего, это не ошибка, даже если она не работает так, как вы этого хотите. – Kayaman

ответ

2

Цитирование Javadoc из new URL(URL context, String spec):

В противном случае, путь рассматривается как относительный путь и добавляется к контекстному пути, как описано в RFC2396.

См раздел 5 «Относительные URI Ссылки» по RFC2396 спецификации, в частности раздел 5.2 «Определение относительных ссылок в абсолютной форме», пункт 6а:

Все, кроме последнего сегмента основного пути Ури компонент копируется в буфер. Другими словами, любые символы после последнего (самого правого) символа косой черты, если таковые имеются, исключаются.

Объяснение

На веб-странице, "Базовый URI" это адрес страницы, например, http://example.com/path/to/page.html. Относительная ссылка, например. <a href="page2.html">, должен быть истолкован как от родного брата к базовому URI, поэтому page.html удаляется, и добавляется page2.html, в результате чего http://example.com/path/to/page2.html, как и предполагалось.

Класс Java URL реализует эту логику, и именно поэтому вы получаете то, что видите, и это полностью так, как должно работать.

Это не дизайн, а не ошибка.