Как вы комбинируете фрагменты URL в Java так же, как это делают браузеры? - PullRequest
2 голосов
/ 23 ноября 2011

ПРИМЕЧАНИЕ : Я прошу проблемы реального мира, а не теоретические цели; см. последнюю часть вопроса - так же, как работают браузеры.


Обычно вы увидите ответ:
new java.net.URL(new java.net.URL(base_url),rel_url).toString

( base_url и rel_url String ). В моем случае base_url - это URL страницы, которую я извлек, rel_url происходит из значения "

Однако такой код не работает для фрагментов URL, например, такие две части:

htpp: //www.hello.com/1.html

? Р = 2

Я тестировал Firefox, Chromium, Opera, Konqueror, «Веб-браузер» (Gnome скромность ;-D) - все они объединяют эти URL как:

htpp: //www.hello.com/1.html р = 2

С кодом, как указано выше, я получаю:

htpp: //www.hello.com/ р = 2

Вопрос

Как вы объединяете фрагменты URL в готовом для мира виде?

Я надеюсь, что для этого уже есть удобная библиотека, прежде чем я сам начну разбирать; -).

1 Ответ

7 голосов
/ 23 ноября 2011

Вы неправильно понимаете, что такое URL. ?p=2 - это строка запроса , а не относительный URL. (Вы также можете найти #foo, который обычно называется идентификатором фрагмента или ссылка и чаще всего используется для перехода к разделу длинного документа). Полная схема для URI описана в Википедии среди многих других мест (вы также можете найти различия между URI и URL-адресами в разных местах).

В любом случае, относительные URL-адреса относятся только к части пути - это абсолютный или относительный путь. Если у вас есть строка запроса и вы хотите присоединить ее к существующему URL (у которого нет строки запроса), просто добавьте ее в строку. Если вы не знаете, есть ли у вас строка запроса, вы можете использовать методы класса URL для ее проверки.

Если вы хотите повторить действия браузеров, укажите полный URL-адрес url и строку s,

if (s.startsWith("?") || s.startsWith("#")) new java.net.URL(url.toString + s)
else new java.net.URL(url, s)

должен сделать трюк. (Я не знаю точный код, который используют разные браузеры, но это повторяет поведение, которое вы описываете при добавлении строки запроса, если это все, что предоставляется в href.) Если вы не знаете, могут ли ваши существующие URL-адреса есть строки запроса или нет, тогда вы можете

if (s.startsWith("#")) new java.net.URL(url.toString.takeWhile(_ != '#') + s)
else if (s.startsWith("?")) new java.net.URL(url.toString.takeWhile(_ != '?') + s)
else new java.net.URL(url, s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...