我正在尝试使用XML
加载URLConnection
页面的内容,但我正在收回垃圾字符。几乎任何其他网站都使用相同的代码,因此我不确定该问题是什么。
以下是相关代码:
String url = "http://myUrl";
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
conn.setConnectTimeout(60*2000); // wait only 60 seconds for a response
conn.setReadTimeout(60*2000);
InputStreamReader isr = new InputStreamReader(conn.getInputStream(), encoding);
BufferedReader in = new BufferedReader(isr);
String inputLine;
while ((inputLine = in.readLine()) != null) {
wholeDocument += inputLine;
}
打印wholeDocument
会产生一堆这样的字符:er���;�pI.���$6
我正在使用encoding = 'UTF-8'
。
我也尝试使用XML
库,例如:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new URL(baseUrl).openStream());
System.out.println("doc = " + doc);
但结果是一样的。在终端应用中使用curl
时(我在mac
上),结果类似,尽管字符如下所示:???0??KZV??????0N6?aH:$?X9v??
?$&gt; ???“< / p>
知道如何解决这个问题吗?
答案 0 :(得分:1)
如果您检查回复的标题,您会看到 Content-Encoding:gzip 表示响应正文已被压缩,您需要先解压缩,这就是原因你得到那些奇怪的角色。有关Http Compression的更多详情。
使用curl
检查标头的好方法是使用详细选项-v
,在这种情况下,感谢curl -v http://sites.one.co.il/XML/VOD/ | more
,我可以快速查看响应标头。
答案 1 :(得分:1)
扩展另一个答案,你可以检查收到的文件是否是gzip编码,如果是,则解码它:
if (conn.getHeaderField("Content-Encoding") != null &&
conn.getHeaderField("Content-Encoding").equals("gzip")){
InputStream gzStream = new GZIPInputStream(conn.getInputStream());
InputStreamReader isr = new InputStreamReader(gzStream, encoding);
} else {
InputStreamReader isr = new InputStreamReader(conn.getInputStream(), encoding);
}
或者,您可以通过以下方式指定您不喜欢gzip编码数据:
conn.setRequestProperty("Accept-Encoding", "identity");