9

ライブラリ 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 が機能しています。

4

3 に答える 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 レスポンスが返されます。したがって、私の推測では、問題は次のいずれかです。

  • 彼らが何らかの構成の問題に苦しんでいたときに、あなたはたまたまリクエストをしました。
  • 彼らは、特定の User-Agent 文字列に対して 404 / 410 を返すようにサーバーを実装しました。

その他の可能性としては、IP アドレスに対して何らかのサーバー側のフィルタリングを行っているか、DNS に問題があり、リクエストが別の IP アドレスに送信されている可能性があります。しかし、これらはどちらも、ブラウザでフィードにアクセスできるという事実と矛盾しているようです.

これが User-Agent の場合は、利用規約を見て、サイト/RSS フィードの特定の種類の使用が禁止されているかどうかを確認してください。

于 2010-05-08T13:17:50.190 に答える
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()));

できます!ご提案いただきありがとうございます。これはユーザーエージェントに関するものです。

于 2010-05-08T13:29:41.940 に答える
4

Javaが好きではないと思います。「User-Agent」ヘッダーを偽造する必要がありますが、RSS ライブラリで実行できるかどうかはわかりません。

もう 1 つの提案は、自分でデータをフェッチし、そのデータをフィード リーダーにフィードすることです。

于 2010-05-08T13:03:31.187 に答える