2008-10-27 35 views
3

我正嘗試從Java中的HttpsURLConnection遠程服務器下載xml.gz文件,但我得到一個空響應。這裏是我的代碼示例:使用HttpsURLConnection下載xml.gz文件

URL server = new URL("https://www.myurl.com/path/sample_file.xml.gz"); 
HttpsURLConnection connection = (HttpsURLConnection)server.openConnection(); 
connection.connect(); 

當我嘗試從連接獲取InputStream時,它是空的。 (如果我嘗試connection.getInputStream()。read()我得到-1)我期待的文件大約是50MB。

爲了測試我的理智,我也嘗試在我的瀏覽器中輸入完全相同的url,並且它確實返回了我需要的文件。我錯過了什麼嗎?我必須在連接中設置某種參數嗎?任何幫助/方向非常感謝。

回答

2

是否有任何異常被記錄?該網站是否提供了自簽名SSL證書,還是沒有由CA簽名的?有幾個原因可以使您的瀏覽器正常工作(瀏覽器可能已被告知接受來自該域的自簽名證書),而不是在您的代碼中。

使用curlwget來獲取URL有什麼結果?

InputStream爲空/來自InputStream.read()== -1的結果意味着流中沒有內容可讀,這意味着流無法正確設置。

更新See this page瞭解如何處理連接代碼中的無效/自簽名證書。或者,如果網站正在提交證書,但該證書無效,則可以將其導入到服務器的密鑰庫中,以告知Java信任該證書。 See this page for more info

+0

提供文件的第三方最初告訴我使用curl如下: curl -location -C - --digest -k https://www.myurl.com/path/sample_file.xml .gz -o sample_file.xml.gz 這工作得很好! – 2008-10-27 17:49:06

+0

帶curl的-k開關意味着「允許連接到沒有證書的SSL站點」,所以我認爲假設該站點沒有提供有效的證書是安全的。您必須更新您的代碼才能解決此問題 – 2008-10-27 18:02:34

+0

curl命令在沒有-k開關的情況下工作。我猜這意味着證書是有效的。 – 2008-10-27 18:37:40

2
  1. 驗證response code是200
  2. 檢查connection.contentType自行覈實相關內容類型是公認
  3. 您可能需要添加一個內容處理器爲GZ MIME類型,我不記得關閉我的頭頂。

描述響應代碼爲3XX的評論後,

  1. 設置 'connection.setFollowRedirects(真)'

應該修復它。

1

原來下載不起作用,因爲遠程服務器將我重定向到一個新的URL來下載文件。儘管connection.setFollowRedirects(真)設置,我仍然不得不手動設置重定向的URL一個新的連接,如下所示:

if (connection.getResponseCode() == 302 && connection.getHeaderField("location") != null){ 
      URL server2 = new URL(connection.getHeaderField("location")); 
      HttpURLConnection connection2 = (HttpURLConnection)server2.openConnection(); 
      connection2.connect(); 
      InputStream in = connection2.getInputStream(); 
} 

在那之後,我能夠檢索從輸入流文件。感謝您的幫助!