Я использую библиотеку 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 работают.
Я подозреваю, что ему не нравится Java. Вам нужно подделать заголовок «User-Agent», не уверенный, что это возможно с вашей библиотекой RSS.
Еще одно предложение - получить данные самостоятельно и передать их программе чтения каналов.
Я попробовал этот код
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.
Код, который выбрасывает это исключение, выглядит так... если предположить, что у меня правильная версия:
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. Поэтому я предполагаю, что проблема заключается в следующем:
Другие возможности заключаются в том, что они осуществляют какую-то фильтрацию IP-адресов на стороне сервера или что существует какая-то проблема с DNS, из-за которой ваши запросы отправляются на другой IP-адрес. Но оба эти варианта опровергаются тем фактом, что вы можете получить доступ к ленте в браузере.
Если это User-Agent, загляните в условия предоставления услуг, чтобы узнать, не запрещены ли у них определенные виды использования их сайта / RSS-канала.