当我在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并走另一条路线......
由于 肯尼。
答案 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();