2010-05-08 13 views
8

Ich benutze Bibliothek rom.dev.java.net, um RSS zu holen.java.io.FileNotFoundException für gültige URL

-Code ist

URL feedUrl = new URL("http://planet.rubyonrails.ru/xml/rss"); 
SyndFeedInput input = new SyndFeedInput(); 
SyndFeed feed = input.build(new XmlReader(feedUrl)); 

können Sie überprüfen, ob http://planet.rubyonrails.ru/xml/rss gilt URL und die Seite wird in Browser angezeigt.

Aber ich bekomme Ausnahme von meiner Anwendung

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) 

Ich habe keine Proxy verwenden. Ich bekomme diese Ausnahme auf meinem PC und auf dem Produktionsserver und nur für diese URL funktionieren andere URLs.

Antwort

3

Ich vermute, dass es Java nicht mag. Sie müssen Ihre "User-Agent" -Kopfzeile fälschen, nicht sicher, ob es mit Ihrer RSS-Bibliothek machbar ist.

Ein anderer Vorschlag ist, dass Sie die Daten selbst holen und die Daten dem Feed-Reader zuführen.

7

Der Code, der diese Ausnahme wirft sieht wie folgt aus ... vorausgesetzt, ich die richtige Version haben:

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

Mit anderen Worten, wenn Sie die GET von Java tun, Sie sind ein immer 404 oder 410 Antwort. Jetzt, wenn ich die Anfrage mit dem wget Dienstprogramm mache, bekomme ich eine 200 Antwort. Also meine Vermutung ist, dass das Problem eines der Folgenden ist:

  • Sie haben die Anfrage gestellt, wenn sie unter einem Konfigurationsproblem leiden.
  • Sie haben ihren Server implementiert, um 404/410 für bestimmte User-Agent-Zeichenfolgen zurückzugeben.
  • Andere Möglichkeiten sind, dass sie eine Art serverseitige Filterung von IP-Adressen durchführen oder dass es ein DNS-Problem gibt, das dazu führt, dass Ihre Anforderungen an eine andere IP-Adresse gesendet werden. Beides scheint jedoch dadurch konterkariert zu sein, dass Sie in Ihrem Browser auf den Feed zugreifen können.

    Wenn dies der Benutzer-Agent ist, werfen Sie einen Blick auf ihre Nutzungsbedingungen, um zu sehen, ob sie bestimmte Arten der Nutzung ihrer Website/RSS-Feeds verboten haben.

    +0

    Ich habe versucht, Seite mit Apacha HttpClient zu bekommen und es funktioniert! Siehe meine Antwort. – Alexei

    4

    Ich habe versucht, diesen Code

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

    Es funktioniert! Danke für deine Vorschläge. Sieht so aus als ob es sich um User-Agent handelt.