-1

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

工作 URL:http ://minneapolis.craigslist.ca/search/sss?catAbb=sss&query=iPhone+sprint&sort=date&srchType=A&format=rss 失败的 URL(以下例外):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() 报告我上面打印的 URL,“+”不是空格。

代码如下,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

4 回答 4

1

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

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

您的示例 URL 似乎显示该空间是用“+”转义的。这是 HTML 表单转义而不是正确的 URL 转义。你似乎是说你得到相同的结果是你使用%20......这将是正确的转义。

因此,我的理论是,您实际上是通过删除转义的路由将此 URL 传递给您的代码......尽管您的跟踪记录似乎告诉您什么。(如果我能看到一个 SSCE,我们就可以测试这个理论......)


FWIW,通过调用 UrlEncoder.encode 来解决问题,正如其他一些答案所暗示的那样,这是一个坏主意。问题是它可能会“编码”其他不应编码的字符。

于 2012-10-01T05:51:18.537 回答
0

URL 本身最好用 new URI(null, url, null).toASCIIString() 编码。

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

于 2012-10-01T08:39:52.627 回答
-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();
于 2012-10-01T05:41:35.873 回答
-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");
于 2012-10-01T05:11:16.427 回答