2010-05-08 9 views
8

Tôi sử dụng thư viện rome.dev.java.net để tìm nạp RSS.java.io.FileNotFoundException cho URL hợp lệ

Mã là

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

Bạn có thể kiểm tra xem http://planet.rubyonrails.ru/xml/rss là URL hợp lệ và trang được hiển thị trong trình duyệt.

Nhưng tôi nhận được ngoại lệ từ ứng dụng của tôi

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) 

tôi không sử dụng bất kỳ proxy. Tôi nhận ngoại lệ này trên PC của tôi và trên máy chủ sản xuất và chỉ cho URL này, các URL khác đang hoạt động.

Trả lời

3

Tôi nghi ngờ nó không thích Java. Bạn cần giả mạo tiêu đề "User-Agent" của bạn, không chắc chắn nếu nó có thể thực hiện được với thư viện RSS của bạn.

Một đề xuất khác là bạn tự tìm nạp dữ liệu và cung cấp dữ liệu cho trình đọc nguồn cấp dữ liệu.

7

Các mã được ném ngoại lệ mà trông như thế này ... giả sử tôi đã có phiên bản đúng:

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

Nói cách khác, khi bạn đang làm GET từ Java, bạn đang nhận được một Phản hồi 404 hoặc 410. Bây giờ khi tôi thực hiện yêu cầu sử dụng tiện ích wget, tôi nhận được phản hồi 200. Vì vậy, tôi đoán là vấn đề là một trong những điều sau đây:

  • Bạn đã xảy ra yêu cầu khi họ gặp phải một số vấn đề cấu hình.
  • Họ đã triển khai máy chủ của họ trả lại 404/410 cho một số chuỗi Tác nhân người dùng nhất định.

Các khả năng khác là họ đang thực hiện một số loại lọc phía máy chủ trên địa chỉ IP hoặc có một số sự cố DNS đang khiến yêu cầu của bạn đi đến một địa chỉ IP khác. Nhưng cả hai điều này dường như mâu thuẫn với thực tế là bạn có thể truy cập nguồn cấp dữ liệu trong trình duyệt của mình.

Nếu đây là tác nhân người dùng, hãy xem điều khoản dịch vụ của họ để xem liệu họ có cấm sử dụng một số loại sử dụng trang web/nguồn cấp dữ liệu RSS của họ hay không.

+0

Tôi đã cố gắng truy cập trang bằng cách sử dụng apacha HttpClient và nó hoạt động! Xem câu trả lời của tôi. – Alexei

4

Tôi đã thử mã này

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

Nó hoạt động! Cảm ơn lời đề nghị của bạn. Có vẻ như đây là về tác nhân người dùng.