2016-08-21 25 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");