3

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を入力しようとしましたが、必要なファイルが返されました。私は何かが足りないのですか?接続に何らかのパラメータを設定する必要がありますか?どんな助け/指示も大歓迎です。

4

3 に答える 3

2
  1. response codeが 200であることを確認します
  2. connection.contentTypeコンテンツ タイプが認識されていることを確認します。
  3. GZ MIME タイプの Content-Handler を追加する必要があるかもしれませんが、これは頭の中で思い出すことができません。

応答コードを 3xx と記述したコメントの後に、

  1. 「connection.setFollowRedirects(true)」を設定します

それを修正する必要があります。

于 2008-10-27T18:03:22.197 に答える
2

ログに記録されている例外はありますか? Web サイトは自己署名 SSL 証明書を提示していますか、それとも CA によって署名されていない証明書を提示していますか? コードではなく、ブラウザーで正常に機能する理由がいくつかあります (ブラウザーは、そのドメインからの自己署名証明書を受け入れるように指示されている可能性があります)。

curlまたはwgetを使用して URL をフェッチすると、どのような結果が得られますか?

InputStream が空である / InputStream.read() == -1 の結果であるという事実は、ストリームに読み取るものが何もないことを意味します。つまり、ストリームを適切にセットアップすることさえできなかったことを意味します。

更新:接続コードで無効な/自己署名証明書を処理する方法については、このページを参照してください。または、サイトが証明書を提示しているが、それが無効な場合は、それをサーバーのキーストアにインポートして、証明書を信頼するように Java に指示できます。詳細については、このページを参照してください

于 2008-10-27T17:37:32.063 に答える
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();
}

その後、入力ストリームからファイルを取得できました。助けてくれてありがとう!

于 2008-10-28T18:27:08.857 に答える