我正在尝试通过HttpGet()方法处理以下网址:
我得到以下例外:
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。
提前致谢。
答案 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
有问题的网址。