URL, к которому вы пытаетесь подключиться, не является допустимым URL в соответствии с RFC 1738 .Символ '|'
не может отображаться в URL без кодировки;см. раздел 2.2.
Использование URLEncoder.encode()
НЕ является ответом.Проблема в том, что URLEncoder.encode()
не предназначен для этой задачи.Скорее, он предназначен для кодирования необработанных символьных данных в формате MIME «application / x-www-form-urlencoded».Это будет:
- % - кодировать такие символы, как
'/'
, ':'
, '?'
и т. Д., В дополнение к неприятным '|'
, - %-кодировать любые символы
'%'
..., что приводит к двойному кодированию%, а - заменять любые пробелы на символы
'+'
, что приводит к искажению URL.
(см.в javadoc для UrlEncoder
для точной спецификации того, какие символы закодированы и как.)
Все эти неправильные / чрезмерные усердия могут быть вредными, в зависимости от того, как сетьСервер обрабатывает URL-адреса.Во имя безопасности многие веб-серверы справляются с URL-адресами, где синтаксически значимые символы кодируются без необходимости, и будут неоднократно декодироваться до тех пор, пока не останется корректных последовательностей кодирования%.Так что во многих случаях вы можете избежать использования URLEncoder
.
Но ни один веб-сервер не должен пытаться превратить '+'
символы в пробелы.И некоторые из защитных уловок могут быть проблематичными;например, если вам действительно нужно отправить '%'
символ данных в URL.
Так, каково реальное решение?К сожалению это сложно.Правильнее всего сделать анализ URL-адреса на его составные части, используя синтаксический анализатор, который допускает синтаксические ошибки URL-адреса, и соединить его, опираясь на класс URL-адреса (или URI-кода) для правильного кодирования компонентов при необходимости.по спецификациям URL / URI .
Либо отклоните URL.В конце концов, является недействительным.