使用 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");
我正在尝试使用 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");