有效的URL导致java.io.FileNotFoundException

10
我使用 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)

我不使用任何代理。我在我的电脑和生产服务器上都遇到了这个异常,但只在这个URL上出现,其他URL都正常工作。

3个回答

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以用于特定的User-Agent字符串。
其他可能性是,他们正在对IP地址进行某种服务器端过滤,或者存在某些DNS问题导致您的请求转到不同的IP地址。但这两个问题都似乎与您可以在浏览器中访问该源相矛盾。
如果这是User-Agent的问题,请查看他们的服务条款,以查看他们是否禁止了其网站/ RSS源的某些使用方式。

我尝试使用apacha HttpClient获取页面,它可以正常工作!请查看我的答案。 - Alexei

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

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


4
我怀疑它不喜欢Java。您需要伪造您的“User-Agent”头,不确定您的RSS库是否支持此功能。另一个建议是自己获取数据并将其提供给订阅阅读器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接