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



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

工作URL:http://minneapolis.craigslist.ca/search/sss?catAbb=sss&query=iPhone+sprint&sort=日期&srchType=A&format=rss失败的URL(以下异常):http://winnipeg.craigslist.ca/search/sss?catAbb=sss&query=iPhone+sprint&sort=日期&srchType=A&format=rss

conn.getInputStream()引发IO异常:"索引67处查询中的非法字符:http://winnipeg.en.craigslist.ca/search/sss?catAbb=sss&query=iPhone sprint two&sort=日期&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,然后走另一条路。。。

谢谢肯尼。

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

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

您的示例URL似乎显示空格是用"+"转义的。这是HTML表单转义,而不是正确的URL转义。你似乎在说,你得到的结果和你使用%20。。。这将是正确的转义。

所以我的理论是,你实际上是通过一个删除转义的路径将这个URL传递给你的代码。。。尽管你的痕迹似乎在告诉你什么。(如果我能看到SSCE,我们就能测试这个理论…)


FWIW,按照其他一些答案的建议,通过调用UrlEncoder.encode来解决问题是个坏主意。问题是,它可能会对其他不应该编码的字符进行"编码"。

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

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

您尝试过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");
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();

相关内容

最新更新