Что я должен сделать, чтобы решить "java.lang.IllegalArgumentException"? - PullRequest
1 голос
/ 12 августа 2010

Я пытаюсь обработать следующий URL-адрес с помощью метода HttpGet ():

https://graph.facebook.com/search?q=Cafe++Bakery&type=event&access_token=&type=event&access_token=239090718395|lqqOnRWlcJOb3QGp3G4HW2aqhlc.

И я получаю следующее исключение:

java.lang.IllegalArgumentException: 
Invalid uri 'https://graph.facebook.com/search?q=Cafe++Bakery&type=event&access_token=&type=event&access_token=239090718395|lqqOnRWlcJOb3QGp3G4HW2aqhlc.': Invalid query
    at org.apache.commons.httpclient.HttpMethodBase.<init>(HttpMethodBase.java:222)
    at org.apache.commons.httpclient.methods.GetMethod.<init>(GetMethod.java:89)

Сейчаскогда я вырезал и вставил этот URL в браузер, он работает просто отлично.Я предполагаю, что это должно быть какое-то кодирование URL, которое должно произойти, но я не уверен, что мне нужно изменить, чтобы вызвать url из Http Client.

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 12 августа 2010

Используйте URLEncoder.encode () для кодирования URL

3 голосов
/ 12 августа 2010

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.В конце концов, является недействительным.

1 голос
/ 17 июня 2011

У меня была такая же проблема, URL выглядит нормально, как обычно, без видимых странных символов или чего-то еще.

Решена проблема с отправкой URL через это:

return new String(maybeIncorrectUrl.getBytes(),"UTF-8");

maybeIncorrectUrl URL-адрес, вызывающий проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...