2010-05-08 170 views
8

我使用庫rome.dev.java.net來獲取RSS。有效URL的java.io.FileNotFoundException

代碼是

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才能正常工作。

回答

3

我懷疑它不喜歡Java。你需要僞造你的「User-Agent」頭文件,不確定它是否適合你的RSS庫。

另一個建議是您自己提取數據並將數據提供給供稿閱讀器。

7

被拋出該異常的代碼看起來是這樣的......假設我已經得到了正確的版本:

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中得到的,你得到一個404或410響應。現在,當我使用wget實用程序執行請求時,我收到了200條響應。所以我的猜測是,問題是以下幾種之一:

  • 您碰巧在遇到某些配置問題時發出請求。
  • 他們已經實現了他們的服務器來爲某些用戶代理字符串返回404/410。

其他的可能性是,他們正在對IP地址進行某種服務器端過濾,或者有一些DNS問題導致您的請求轉到其他IP地址。但是,這兩者似乎都與您可以在瀏覽器中訪問Feed的事實相抵觸。

如果這是用戶代理,請查看他們的服務條款,以查看他們是否禁止某些類型的用戶使用他們的網站/ RSS提要。

+0

我試圖讓頁面使用apacha HttpClient,它的工作原理!看到我的答案。 – Alexei 2010-05-08 13:30:33

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

它的工作原理!感謝您的建議。看起來這是關於用戶代理的。