转义URLConnection.getInputStream()的URL的正确方法是什么?

时间:2012-10-01 04:49:54

标签: java android urlconnection

当我在URI的查询字符串部分中有空格('')时,URLConnection.getInputStream()遇到了一个非常奇怪的问题。具体来说,我有一个有效的URL和另一个无效的URL,当我认为它们都应该失败或两者都成功时,另外,它每次都有。

工作网址:http://minneapolis.craigslist.ca/search/sss?catAbb=sss&query=iPhone+sprint&sort=date&srchType=A&format=rss 网址失败(以下例外):http://winnipeg.craigslist.ca/search/sss?catAbb=sss&query=iPhone+sprint&sort=date&srchType=A&format=rss

conn.getInputStream()抛出IO异常:“索引67处的查询中出现非法字符:http://winnipeg.en.craigslist.ca/search/sss?catAbb=sss&query=iPhone sprint two& sort = date& srchType = A& format = rss”

看来openConnection无法获得空间(我已经用'+'取代了,因为我希望用'URL',我也试过'%20'同样的结果

此外,URL.toString()报告上面打印的URLS,而“+”不是空格。

代码如下,searchUrl是一个'URL'实例。

        URLConnection conn = null;
        conn = searchUrl.openConnection();
        conn.setConnectTimeout(CONNECT_TIMEOUT);
        conn.setUseCaches(true);
        conn.setAllowUserInteraction(false);

        ByteArrayOutputStream oStream = new ByteArrayOutputStream();
        InputStream istream = conn.getInputStream();
        int numBytesRead, numBytesWritten = 0;
        byte[] buffer = new byte[8 * 1024];
        while ((numBytesRead = istream.read(buffer, 0, 8 * 1024)) > 0) {
            oStream.write(buffer, numBytesWritten, numBytesRead);
            numBytesWritten += numBytesRead;
        }

关于在哪处处理此问题的任何想法?我即将推出URLConnection并走另一条路线......

由于 肯尼。

4 个答案:

答案 0 :(得分:1)

您的问题有问题(请参阅我的评论)。

但是,这里的根本问题是查询部分中带有空格字符的URL不是合法的URL ...不能承受典型的Web浏览器会接受它。因此例外是正确的。

您的示例网址似乎显示该空格已使用“+”进行转义。这是HTML表单转义不正确的URL转义。你似乎在说你得到了同样的结果是你使用%20 ......这是正确的逃避。

所以我的理论是你实际上是通过一条删除转义的路径将这个URL传递给你的代码......不能承受你的跟踪记录似乎在告诉你什么。 (如果我能看到SSCE,我们就能够测试这个理论......)


FWIW,通过调用UrlEncoder.encode修复问题,因为其他一些答案已经提出了一个坏主意。问题是它很可能“编码”其他不应编码的字符。

答案 1 :(得分:0)

URL本身最好使用新URI(null,url,null).toASCIIString()进行编码。

查询字符串中的每个键和值都可以使用URLEncoder.encode()单独编码。根据{{​​3}},这是不正确的,整个事情应该按照URL本身编码,但我从未见过它失败。

答案 2 :(得分:-1)

您是否尝试过URLEncoder.encode(string, "UTF-8")

以下是示例:

替换

String url = "http://somesite.com/page?user=" + user;

String url = "http://somesite.com/page?user="
+ URLEncoder.encode(user, "UTF-8");

答案 3 :(得分:-1)

String url= URLEncoder.encode("your URL without http or your query string part here");
URL searchUrl = new URL("http://" + url);
URLConnection conn = null;
conn = searchUrl.openConnection();