使用HttpsURLConnection下载xml.gz文件

时间:2008-10-27 17:16:32

标签: java ssl https

我正在尝试使用Java中的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,它确实返回了我需要的文件。我错过了什么吗?我是否必须在连接中设置某种参数?非常感谢任何帮助/方向。

3 个答案:

答案 0 :(得分:2)

是否记录了任何异常?网站是否提供自签名SSL证书,还是未经CA签名的证书?有几个原因导致它可能在您的浏览器中正常工作(浏览器可能被告知接受来自该域的自签名证书)而不是您的代码。

使用curlwget获取网址有什么结果?

InputStream为空/来自InputStream.read()== -1的结果这意味着流中没有任何内容可供读取,这意味着流甚至无法正确设置。

更新See this page,了解有关如何处理连接代码中的无效/自签名证书的一些信息。或者,如果站点提供证书但证书无效,您可以将其导入服务器的密钥库,以告知Java信任该证书。 See this page for more info

答案 1 :(得分:2)

  1. 验证response code是否为200
  2. 检查connection.contentType以确认内容类型已被识别
  3. 你可能需要为GZ mime类型添加一个Content-Handler,我无法忘记这一点。
  4. 在将回复代码描述为3xx后,

    1. 设置'connection.setFollowRedirects(true)'
    2. 应该修理它。

答案 2 :(得分:1)

原来下载无法正常工作,因为远程服务器正在将我重定向到新的URL来下载文件。即使设置了connection.setFollowRedirects(true),我仍然必须为重定向的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();
}

之后,我能够从输入流中检索文件。谢谢你们的帮助!