我要解决“java.lang.IllegalArgumentException”需要做什么?

时间:2010-08-12 11:23:15

标签: java facebook exception-handling httpclient

我正在尝试通过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)

现在当我切割&amp;将该URL粘贴到浏览器中它可以正常工作。我是 猜测它是某种需要发生的URL编码,但我不确定我必须更改为从Http客户端调用url。

提前致谢。

3 个答案:

答案 0 :(得分:4)

使用URLEncoder.encode()对网址进行编码

答案 1 :(得分:3)

根据RFC 1738,您尝试连接的网址不是有效网址。角色'|'无法在网址中显示为未编码;见2.2节。

使用URLEncoder.encode()不是答案。问题是URLEncoder.encode()不是为此任务设计的。相反,它被设计用于将原始字符数据编码为“application / x-www-form-urlencoded”MIME格式。这将:

  • % - 编码'/'':''?'等字符,此外还有麻烦'|'
  • % - 对任何'%'个字符进行编码...导致双重%编码,
  • 将所有空格字符替换为'+'个字符,从而导致网址错位。

(请参阅UrlEncoder的javadoc,了解编码字符的精确规格,以及如何编写。)

所有这些不正确/过度热心都可能有害,具体取决于Web服务器处理URL的方式。在安全性的名称中,许多网络服务器处理不必要地编码语法上重要的字符的URL,并且将重复解码,直到没有保留有效的%编码序列。因此,在很多情况下,您可以使用URLEncoder

但是没有网络服务器应该尝试将'+'个字符转换为空格字符。一些防御技巧可能会有问题;例如如果你真的需要在URL中发送'%'数据字符。

那么真正的解决方案是什么?不幸的是很难。正确的做法是使用容忍URL语法错误的解析器将URL解析为其组成部分,然后依靠URL(或URI)类将其重新组合在一起,根据需要正确编码组件通过URL / URI规范

或者,拒绝URL。毕竟, 无效。

答案 2 :(得分:1)

我有同样的问题,网址看起来正常,可能是,没有可见的奇怪字符或任何东西。

解决了发送URL的问题:

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

maybeIncorrectUrl有问题的网址。