2010-08-12 44 views
1

我正在尝试通过HttpGet()方法处理以下URL:我需要做些什么来解决“java.lang.IllegalArgumentException”?

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到它的作品就好了browswer。我是 猜测它是某种需要发生的URL编码,但我不确定我必须更改什么才能从Http Client调用URL。

在此先感谢。

+1

尝试使用URL编码'|'。它的代码是'%7C'。 – David 2010-08-12 11:26:38

+1

显示代码将有所帮助 – 2010-08-12 11:27:43

+0

您的问题的标题非常糟糕^^,就好像IllegalArgumentException仅在HttpGet中发生xD – velop 2013-07-05 11:01:07

回答

4

使用URLEncoder.encode()编码的URL

+0

URLEncoder.encode()方法在API级别1中已弃用。 请改用encode(String,String)。 等效于编码(s,“UTF-8”)。 – ozmank 2016-03-21 11:03:50

3

你要连接到的网址是不是按照RFC 1738有效的URL。字符'|'不能在URL中显示未编码;参见2.2节。使用URLEncoder.encode()不是答案。问题是URLEncoder.encode()不适用于此任务。而是设计用于将原始字符数据编码为“application/x-www-form-urlencoded”MIME格式。这将:

  • %-encode一个字符,如'/'':''?'等,除了麻烦'|'
  • %-encode任何'%'字符...造成双重%编码,并且
  • '+'字符替换任何空格字符,导致URL调整。

(请参阅Javadoc文档UrlEncoder的精确规范什么的字符编码,以及如何。)

所有这些不正确/过分热心的可能是有害的,这取决于如何在Web服务器处理网址。以安全性为名,很多网络服务器都处理不必要地对语法重要字符进行编码的URL,并且将重复解码直到没有看到有效的%编码序列。所以在很多情况下,你可以使用URLEncoder

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

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

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

1

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

解决的概率与发送URL通过这个:

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

maybeIncorrectUrl beeing问题的URL。

相关问题