我正在尝试使用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,它确实返回了我需要的文件。我错过了什么吗?我是否必须在连接中设置某种参数?非常感谢任何帮助/方向。
答案 0 :(得分:2)
是否记录了任何异常?网站是否提供自签名SSL证书,还是未经CA签名的证书?有几个原因导致它可能在您的浏览器中正常工作(浏览器可能被告知接受来自该域的自签名证书)而不是您的代码。
InputStream为空/来自InputStream.read()== -1的结果这意味着流中没有任何内容可供读取,这意味着流甚至无法正确设置。
更新:See this page,了解有关如何处理连接代码中的无效/自签名证书的一些信息。或者,如果站点提供证书但证书无效,您可以将其导入服务器的密钥库,以告知Java信任该证书。 See this page for more info
答案 1 :(得分:2)
response code
是否为200 connection.contentType
以确认内容类型已被识别在将回复代码描述为3xx后,
应该修理它。
答案 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();
}
之后,我能够从输入流中检索文件。谢谢你们的帮助!