java.io. FileNotFoundException для допустимого URL

Я использую библиотеку rome.dev.java.net для выборки RSS.

Код

URL feedUrl = new URL("http://planet.rubyonrails.ru/xml/rss");
SyndFeedInput input = new SyndFeedInput();
SyndFeed feed = input.build(new XmlReader(feedUrl));

Можно проверить, что http://planet.rubyonrails.ru/xml/rss является допустимый URL, и страницу показывают в браузере.

Но я получаю исключение из своего приложения

java.io.FileNotFoundException: http://planet.rubyonrails.ru/xml/rss
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1311)
        at com.sun.syndication.io.XmlReader.(XmlReader.java:237)
        at com.sun.syndication.io.XmlReader.(XmlReader.java:213)
        at rssdaemonapp.ValidatorThread.run(ValidatorThread.java:32)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:619)

Я не использую прокси. Я получаю это исключение на своем ПК и на рабочем сервере и только для этого URL, другие URL работают.

8
задан Alexei 8 May 2010 в 12:16
поделиться

3 ответа

Я подозреваю, что ему не нравится Java. Вам нужно подделать заголовок «User-Agent», не уверенный, что это возможно с вашей библиотекой RSS.

Еще одно предложение - получить данные самостоятельно и передать их программе чтения каналов.

4
ответ дан 5 December 2019 в 10:39
поделиться

Я попробовал этот код

HttpClient httpClient = new DefaultHttpClient();
HttpGet pageGet = new HttpGet(feedUrl.toURI());
HttpResponse response = httpClient.execute(pageGet);
SyndFeedInput input = new SyndFeedInput();
SyndFeed feed = input.build(new XmlReader(response.getEntity().getContent()));

Он работает! Спасибо за ваши предложения. Похоже, дело в user-agent.

4
ответ дан 5 December 2019 в 10:39
поделиться

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

if (respCode >= 400) {
    if (respCode == 404 || respCode == 410) {
        throw new FileNotFoundException(url.toString());
    } else {
        throw new java.io.IOException(
            "Server returned HTTP"
            + " response code: " + respCode
            + " for URL: " + url.toString());
    }
}

Другими словами, когда вы выполняете GET из Java, вы получаете ответ 404 или 410. Теперь, когда я делаю запрос с помощью утилиты wget, я получаю ответ 200. Поэтому я предполагаю, что проблема заключается в следующем:

  • Вы случайно сделали запрос, когда у них были проблемы с конфигурацией.
  • Они внедрили свой сервер для возврата 404 / 410 для определенных строк User-Agent.

Другие возможности заключаются в том, что они осуществляют какую-то фильтрацию IP-адресов на стороне сервера или что существует какая-то проблема с DNS, из-за которой ваши запросы отправляются на другой IP-адрес. Но оба эти варианта опровергаются тем фактом, что вы можете получить доступ к ленте в браузере.

Если это User-Agent, загляните в условия предоставления услуг, чтобы узнать, не запрещены ли у них определенные виды использования их сайта / RSS-канала.

8
ответ дан 5 December 2019 в 10:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: