2016-08-21 32 views
1

我试图使用URLConnection加载XML页面的内容,但我收回了垃圾字符。相同的代码适用于我几乎任何其他网站,所以我不知道是什么问题。使用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.���$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???$> ???

任何想法如何解决这个问题?

回答

1

如果您检查回复的标题,您将看到内容编码:gzip表示响应的主体已被压缩,您需要首先解压缩它,这就是为什么您会得到那些奇怪的字符。有关Http Compression的更多详情。

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

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");