Загрузите файл xml.gz с помощью HttpsURLConnection - PullRequest
3 голосов
/ 27 октября 2008

Я пытаюсь загрузить файл xml.gz с удаленного сервера с помощью HttpsURLConnection в Java, но я получаю пустой ответ. Вот пример моего кода:

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) Файл, который я ожидаю, составляет приблизительно 50 МБ.

Чтобы проверить мое здравомыслие, я также попытался ввести точно такой же URL в моем браузере, и он вернул нужный мне файл. Я что-то пропустил? Должен ли я установить какой-то параметр в соединении? Любая помощь / направление очень ценится.

Ответы [ 3 ]

2 голосов
/ 27 октября 2008
  1. Убедитесь, что response code равно 200
  2. Убедитесь, что connection.contentType, чтобы проверить, распознается ли тип контента
  3. Возможно, вам понадобится добавить Content-Handler для типа пантомимы GZ, который я не могу вспомнить из головы.

После комментария, описывающего код ответа как 3xx,

  1. Установить 'connection.setFollowRedirects (true)'

Должен исправить это.

2 голосов
/ 27 октября 2008

Регистрируется ли какое-либо исключение? Представляет ли веб-сайт самозаверяющий сертификат SSL или тот, который не подписан центром сертификации? Существует несколько причин, по которым он может нормально работать в вашем браузере (браузеру может быть предложено принимать самозаверяющие сертификаты из этого домена), а не в вашем коде.

Каковы результаты использования curl или wget для получения URL-адреса?

Тот факт, что InputStream является пустым / является результатом InputStream.read () == -1, означает, что в потоке нет ничего для чтения, что означает, что поток не может быть даже настроен должным образом.

Обновление : См. На этой странице некоторую информацию о том, как вы можете обращаться с недействительными / самозаверяющими сертификатами в вашем коде подключения. Или, если сайт представляет сертификат, но он недействителен, вы можете импортировать его в хранилище ключей сервера, чтобы сообщить Java, что он должен доверять сертификату. Для получения дополнительной информации см. Эту страницу .

1 голос
/ 28 октября 2008

Оказывается, загрузка не работала, потому что удаленный сервер перенаправлял меня на новый 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();
}

После этого мне удалось извлечь файл из входного потока. Спасибо за вашу помощь, ребята!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...