如何使用Java訂閱RSS Feed?

banq發表於2022-09-18

RSS 提要是從流行網站獲取最新新聞文章的常用方法之一。
在本部落格中,我們將使用 java 庫rome庫透過 rss 提要從技術部落格網站獲取文章。

我們的用例是從流行的部落格頁面(如https://www.jdon.com/rss等)獲取 RSS 提要。

客戶端
現在我們有了 rss feed url,我們可以利用它的優勢透過拉取文章來閱讀它。
我們將首先在 IDE 中建立專案 RSSReaderClient。然後第一個任務是將Roma庫新增到 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>RSSReaderClient</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>rome</groupId>
            <artifactId>rome</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>

</project>


POJO 儲存新聞文章

  • 讓我們建立 NewsArticle POJO 來儲存文章資料。我們稍後會需要它。

import java.util.List;

public class NewsArticle {
    private String title;
    private String link;
    private String imgUrl;
    private List<String> categories;

    public String getPublishedDate() {
        return publishedDate;
    }

    public void setPublishedDate(String publishedDate) {
        this.publishedDate = publishedDate;
    }

    private String publishedDate;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getLink() {
        return link;
    }

    public void setLink(String link) {
        this.link = link;
    }

    public String getImgUrl() {
        return imgUrl;
    }

    public void setImgUrl(String imgUrl) {
        this.imgUrl = imgUrl;
    }

    public List<String> getCategories() {
        return categories;
    }

    public void setCategories(List<String> categories) {
        this.categories = categories;
    }

    @Override
    public String toString() {
        return "NewsArticle{" +
                "title='" + title + '\'' +
                ", link='" + link + '\'' +
                ", imgUrl='" + imgUrl + '\'' +
                ", categories=" + categories +
                ", publishedDate='" + publishedDate + '\'' +
                '}';
    }
}


RSS 閱讀器的實用程式類

  • 此外,我們將建立實用程式類來執行讀取 rss 提要操作,然後將結果對映到我們之前建立的 NewsArticle POJO。

import com.rometools.rome.feed.synd.SyndEntry;
import com.rometools.rome.feed.synd.SyndFeed;
import com.rometools.rome.io.FeedException;
import com.rometools.rome.io.SyndFeedInput;
import com.rometools.rome.io.XmlReader;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class RSSReaderUtil {

    public static List<NewsArticle> read(String feedUrl) throws IOException, FeedException {
        URL feedSource = new URL(feedUrl);
        SyndFeedInput input = new SyndFeedInput();
        SyndFeed feed = input.build(new XmlReader(feedSource));
        Iterator itr = feed.getEntries().iterator();
        List<NewsArticle> results = new ArrayList<>();
        while (itr.hasNext()) {
            SyndEntry syndEntry = (SyndEntry) itr.next();
            results.add(mapToArticle(syndEntry));
        }

        return results;
    }

    /**
     * Map to Article
     * @param syndEntry
     */
    private static NewsArticle mapToArticle(SyndEntry syndEntry) {
        NewsArticle newsArticle = new NewsArticle();
        newsArticle.setTitle(syndEntry.getTitle());
        newsArticle.setPublishedDate(syndEntry.getPublishedDate().toString());
        newsArticle.setImgUrl("");
        newsArticle.setLink(syndEntry.getLink());
        return newsArticle;
    }
}


讀客戶端

  • 一旦我們準備好實用程式,那麼我們所要做的就是在我們的客戶端中使用它。
  • 我們有我們將定位並從中提取文章的提要列表
  • 我們將傳遞給它我們的 RssReaderUtility.read() 方法,它將返回 List<NewsArticle> 的響應
  • 一旦我們得到響應,我們所要做的就是列印它。

import com.rometools.rome.io.FeedException;

import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.List;

public class RSSReader {

    public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException, FeedException {
        URL feedSource = new URL("https://www.jdon.com/rss");
        List<String> targetFeedsList = List.of("https://www.jdon.com/rss",
                "https://eng.uber.com/feed/",
                "https://eng.lyft.com/feed",
                "https://netflixtechblog.com/feed");

        for(String url : targetFeedsList){
            List<NewsArticle> results = RSSReaderUtil.read(url);
            System.out.println("url : "+url);
            results.stream().forEach(a-> System.out.println(a.toString()));
            System.out.println("==========");
        }
    }
}


測試客戶端
  • 讓我們執行我們的 java 應用程式,按照我們的邏輯,我們的閱讀器將讀取提要列表並列印它。
  • 正如您在輸出的螢幕截圖中所見,我們擁有來自谷歌雲部落格的所有最新 rss 提要。

相關文章