使用 URLConnection 加载 xml 内容时出现垃圾

Garbage when loading xml content with URLConnection

我正在尝试使用 URLConnection 加载 XML 页面的内容,但返回的是垃圾字符。相同的代码对我几乎适用于任何其他网站,所以我不确定是什么问题。

相关代码如下:

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.���

我正在使用 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???$>???`

知道如何解决这个问题吗?

如果您检查回复的 headers,您将看到 Content-Encoding: gzip 表示回复的 body压缩后,你需要先解压它,这就是为什么你会得到那些奇怪的字符。有关 Http Compression 的更多详细信息。

curl 检查 headers 的一个好方法是使用详细选项 -v,在这种情况下感谢 curl -v http://sites.one.co.il/XML/VOD/ | more,我可以很快看到响应 headers.

扩展另一个答案,您可以检查接收到的文件是否是 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");