2010-05-08 112 views
8

我使用库rome.dev.java.net来获取RSS。有效URL的java.io.FileNotFoundException

代码是

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才能正常工作。

回答

3

我怀疑它不喜欢Java。你需要伪造你的“User-Agent”头文件,不确定它是否适合你的RSS库。

另一个建议是您自己提取数据并将数据提供给供稿阅读器。

7

被抛出该异常的代码看起来是这样的......假设我已经得到了正确的版本:

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中得到的,你得到一个404或410响应。现在,当我使用wget实用程序执行请求时,我收到了200条响应。所以我的猜测是,问题是以下几种之一:

  • 您碰巧在遇到某些配置问题时发出请求。
  • 他们已经实现了他们的服务器来为某些用户代理字符串返回404/410。

其他的可能性是,他们正在对IP地址进行某种服务器端过滤,或者有一些DNS问题导致您的请求转到其他IP地址。但是,这两者似乎都与您可以在浏览器中访问Feed的事实相抵触。

如果这是用户代理,请查看他们的服务条款,以查看他们是否禁止某些类型的用户使用他们的网站/ RSS提要。

+0

我试图让页面使用apacha HttpClient,它的工作原理!看到我的答案。 – Alexei 2010-05-08 13:30:33

4

我想这个代码

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())); 

它的工作原理!感谢您的建议。看起来这是关于用户代理的。