2010-05-08 10 views
8

Używam biblioteki rome.dev.java.net do pobierania RSS.Wyjątek java.io.FileNotFoundException dla prawidłowego adresu URL

Code jest

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

Można sprawdzić, że http://planet.rubyonrails.ru/xml/rss jest poprawny adres URL, a strona jest wyświetlana w przeglądarce.

Ale otrzymuję wyjątek od mojego wniosku

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) 

nie używam żadnego proxy. Dostaję ten wyjątek na moim komputerze i serwerze produkcyjnym i tylko dla tego adresu URL działają inne adresy URL.

Odpowiedz

3

Podejrzewam, że nie lubi Java. Musisz sfałszować nagłówek "User-Agent", nie wiesz, czy jest to wykonalne z twoją biblioteką RSS.

Inną propozycją jest, aby samodzielnie pobrać dane i wprowadzić dane do czytnika kanałów.

7

Kod, który rzuca ten wyjątek wygląda następująco ... zakładając, że mam odpowiednią wersję:

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

Innymi słowy, kiedy robisz dostać od Javy, jesteś coraz Odpowiedź 404 lub 410. Teraz, gdy wykonuję żądanie przy użyciu narzędzia wget, otrzymuję odpowiedź 200. Zgaduję, że jest to jeden z następujących problemów:

  • Zdarzyło się, że wniosek został złożony, gdy wystąpił problem z konfiguracją.
  • Wdrożyły swój serwer, aby zwrócić 404/410 dla pewnych ciągów User-Agent.

Inne możliwości polegają na tym, że przeprowadzają filtrowanie po stronie serwera na adresach IP lub że występuje problem z serwerem DNS, który powoduje, że żądania są wysyłane na inny adres IP. Ale oba te pytania są sprzeczne z faktem, że można uzyskać dostęp do kanału w przeglądarce.

Jeśli to Użytkownik-Agent, spójrz na ich warunki korzystania z usługi, aby sprawdzić, czy mają one zakazane pewne rodzaje korzystania z ich strony/kanału RSS.

+0

Próbowałem uzyskać stronę za pomocą apacha HttpClient i to działa! Zobacz moją odpowiedź. – Alexei

4

Próbowałem ten kod

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

To działa! Dziękuję za sugestie. Wygląda na to, że chodzi o agent użytkownika.

Powiązane problemy