我使用库 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.<init>(XmlReader.java:237)
at com.sun.syndication.io.XmlReader.<init>(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)
我不使用任何代理。我在我的 PC 和生产服务器上遇到此异常,并且仅针对此 URL,其他 URL 有效。
最佳答案
抛出该异常的代码看起来像这样......假设我有正确的版本:
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());
}
}
换句话说,当您从 Java 执行 GET 时,您将收到 404 或 410 响应。现在,当我使用 wget
实用程序发出请求时,我收到了 200 响应。所以我的猜测是问题是以下之一:
- 当他们遇到一些配置问题时,您恰好提出了请求。
- 他们已经实现他们的服务器以针对某些用户代理字符串返回 404/410。
其他可能性是他们正在对 IP 地址进行某种服务器端过滤,或者存在某些 DNS 问题导致您的请求转到不同的 IP 地址。但这两者似乎都与您可以在浏览器中访问提要这一事实相矛盾。
如果这是用户代理,请查看他们的服务条款,看看他们是否禁止某些类型的网站/RSS 提要的使用。
关于有效 URL 的 java.io.FileNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2794006/