有效URL的java.io.FileNotFoundException
我使用库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)
我不使用任何代理。 我在我的PC和生产服务器上遇到此exception,并且只有此URL,其他URL正在运行。
抛出exception的代码看起来像这样……假设我有正确的版本:
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响应。 所以我的猜测是问题是以下之一:
- 当他们遇到一些配置问题时,您碰巧提出了请求。
- 他们已经实现了他们的服务器以返回某些User-Agent字符串的404/410。
其他可能性是他们正在对IP地址进行某种服务器端过滤,或者存在一些DNS问题导致您的请求转到不同的IP地址。 但是,这两者似乎都与您可以在浏览器中访问Feed的事实相矛盾。
如果这是用户代理,请查看他们的服务条款,看看他们是否禁止某些类型的网站/ 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()));
有用! 谢谢你的建议。 看起来这是关于用户代理的。
我怀疑它不喜欢Java。 您需要伪造“User-Agent”标头,不确定它是否适用于您的RSS库。
另一个建议是您自己获取数据并将数据提供给Feed阅读器。