Java - новый URL() не экранирует первый символ

Я пытаюсь создать ссылку, которая открывает страницу New issue на Github, заполняя ее существующими знаниями о проблеме.

Для этого я использую следующие параметры запроса:

https://github.com/User/Repository/issues/new?title=Some text&body=More Text

Это отлично работает, однако я пытаюсь отформатировать документ с помощью Markdown, и все символы экранируются после создания нового URL путем вызова

URL url = new URL("https://github.com/User/Repository/issues/new?title=Some text&body=# Header # Another header");

Результат будет таким:

https://github.com/User/Repository/issues/new?title=Some text&body=# Header %23 Another header

второй # экранируется, а первый нет, и я не совсем понимаю, почему.

Любые идеи?


person Marcel    schedule 06.03.2018    source источник
comment
Я подозреваю, что это потому, что многие URL-адреса используют один # для параметров, которые оцениваются в JavaScript.   -  person NielsNet    schedule 06.03.2018


Ответы (1)


Короче говоря, синтаксический анализатор URL обрабатывает ваш первый # как фрагмент (он же якорь, например <a name="named-anchor">). Поскольку в соответствии с RFC-3986: Раздел 3, фрагмент должен быть последним и # является зарезервированным символом, все, что следует за первым #, считается частью этого фрагмента, что приводит к тому, что синтаксический анализатор кодирует любые дальнейшие недопустимые символы, такие как ваш второй #. Из РФЦ:

Общий синтаксис URI состоит из иерархической последовательности компонентов, называемых схемой, полномочием, путем, запросом и фрагментом.

URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

Обратите внимание, что fragment идет последним и ограничивается #.

Лучший способ справиться с этим:

  1. закодируйте параметр запроса body самостоятельно или
  2. используйте HTTP-клиент, который выполняет экранирование для вас, например. RestTemplate из Spring или HttpComponents Apache.
person Brian    schedule 06.03.2018
comment
проблема в том, что я сам не делаю http-запрос, а вместо этого использую Desktop.browse, так как я хочу, чтобы браузер открывался. - person Marcel; 06.03.2018
comment
Тогда вы хотите (1). Когда вы создаете свой URL-адрес для передачи в Desktop.browse, используйте ответы по ссылке в моем ответе, чтобы закодировать параметры вашего запроса при его создании. - person Brian; 06.03.2018