Опасен ли url.openStream? - PullRequest
       9

Опасен ли url.openStream?

6 голосов
/ 07 июня 2010

Я использовал метод java.net.URL.openStream() для получения контента с сервера. Недавно я столкнулся с проблемой, когда код ответа HTTP указывал на ошибку, но вместо того, чтобы генерировать исключение, поток все равно читался. Это заставило ошибку появиться намного позже в выполнении и оказалось красной сельдью. Насколько я вижу, когда вы открыли поток с помощью этого метода, нет способа проверить код ответа HTTP.

Единственный способ справиться с этим, который я смог найти, - это получить соединение до открытия потока:

HttpURLConnection conn=(HttpURLConnection) url.openConnection()
#Code updated with scotth's suggestion
if(!String.valueOf(conn.getResponseCode()).startsWith('2'))
    throw new IOException("Incorrect response code "+conn.getResponseCode()+" Message: " +getResponseMessage());
rawIn=conn.getInputStream()

InputStream in=conn.getInputStream()

Так вы согласны? Существуют ли какие-либо хорошие условия для безопасного использования openStream или не рекомендуется его использовать. Стоит отметить, что Sun использует метод в своем учебном коде для чтения непосредственно с URL . С другой стороны, код генерирует Exception, поэтому он не является бастионом хорошей практики кодирования.

1 Ответ

5 голосов
/ 07 июня 2010

openStream() отлично работает, если вы хотите, чтобы ваш класс был защищен от изменений в типе URL - например, между абсолютными путями к файлам (file: ///), ресурсами, содержащимися в jar, и потенциальнодругие протоколы могут быть даже с пользовательскими обработчиками протоколов (scotth: //foo.bar).

Однако, как вы обнаружили, его абстракция довольно высока, поэтому, если вы хотите узнать какие-либо подробности о природевзаимодействие с ресурсом, которое вам необходимо openConnection() и приведение по своему усмотрению.

Re: другие коды состояния - вы, вероятно, захотите взглянуть на RFC2616 - если все, что вам нужноо "успешно" вы можете просто проверить, что String.valueOf(conn.getResponseCode()).startsWith('2').

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