有效URL的java.io.FileNotFoundException

时间:2010-05-08 12:16:45

标签: java url rss ioexception rome

我使用库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是否为有效网址,并且该网页会显示在浏览器中。

但我从我的申请中得到例外

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 个答案:

答案 0 :(得分:8)

抛出异常的代码看起来像这样......假设我有正确的版本:

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地址。但是,这两者似乎都与您可以在浏览器中访问Feed的事实相矛盾。

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

答案 1 :(得分:4)

我怀疑它不喜欢Java。您需要伪造“User-Agent”标头,不确定它是否适用于您的RSS库。

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

答案 2 :(得分: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()));

有效!谢谢你的建议。看起来这是关于用户代理。