Spring boot 入门 使用rome实现RSS 订阅

位置:首页>文章>详情   分类: 教程分享 > Java教程   阅读(3367)   2023-03-28 11:29:14

引言

    在本教程中,学习从spring boot应用程序创建和使用RSS和Atom提要。 您必须在各种网站上(例如我们的RSS提要)以文本或图像按钮的形式看到这一点,邀请您“通过RSS订阅”。RSS是简单的联合API - 通常称为Rich Site Summary。 RSS革新了用户与在线内容交互的方式。

    与RSS类似,Atom也是基于XML的Web内容和元数据联合格式,以及用于发布和编辑属于定期更新网站的Web资源的应用程序级协议。 所有Atom提要必须是格式良好的XML文档,应用程序/ atom + xml媒体类型。
 

一.概述

    在这个spring boot例子中,我们将使用spring bootAPI公开两个简单的RSS和ATOM端点,我们将看到如何使用java客户端来使用这些订阅。

二.环境准备

  • JDK 1.8, Eclipse, Maven – 开发环境
  • Spring-boot – 底层的应用程序框架
  • ROME library – 用于发布Feed

三.如何实现?

    基本上用Spring框架发布RSS或Atom提要非常简单。 在Spring框架中有两个http消息转换器(RssChannelHttpMessageConverter和AtomFeedHttpMessageConverter),可以将spring控制器方法的响应转换为XML feed格式,如果返回类型与任何这些feed有关。

    两个转换器都依赖于ROME库,当它发现类路径中的库时,Spring Framework会自动注册这两个转换器。 我们所要做的就是将ROME库作为依赖添加到我们的pom.xml中。

3.1 创建spring boot项目

创建项目
Spring Boot 项目创建可以参考:Spring Boot 入门 创建项目

3.2添加ROAM依赖

<dependency>
    <groupId>com.rometools</groupId>
    <artifactId>rome</artifactId>
    <version>1.8.0</version>
</dependency>

3.2创建一个controller

    现在添加一个Spring Controller,并分别添加两个端点/ rss和/ atom来公开RSS和Atom提要。 正如我们已经提到的,只是添加这个控制器会自动工作的情况下,因为内部弹簧框架将注册两个http消息转换器(RssChannelHttpMessageConverter和AtomFeedHttpMessageConverter),一旦我们在类路径中有ROAM依赖关系,将被注册。

    只有我们需要这样做才能从控制器方法返回适当的Feed类型对象。 在我们的例子中,feed对象的类型是com.rometools.rome.feed.rss.Channel,而Atom则是com.rometools.rome.feed.atom.Feed。 所以在添加Feed的内容和有关频道的其他细节之后,我们的控制器将如下所示。
package net.xqlee.project.controller;

import java.util.Collections;
import java.util.Date;
 
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
import com.rometools.rome.feed.atom.Category;
import com.rometools.rome.feed.atom.Content;
import com.rometools.rome.feed.atom.Entry;
import com.rometools.rome.feed.atom.Feed;
import com.rometools.rome.feed.atom.Link;
import com.rometools.rome.feed.atom.Person;
import com.rometools.rome.feed.rss.Channel;
import com.rometools.rome.feed.rss.Description;
import com.rometools.rome.feed.rss.Image;
import com.rometools.rome.feed.rss.Item;
import com.rometools.rome.feed.synd.SyndPerson;
 
@RestController
public class FeedController {
 
    @GetMapping(path = "/rss")
    public Channel rss() {
        Channel channel = new Channel();
        channel.setFeedType("rss_2.0");
        channel.setTitle("Leftso Feed");
        channel.setDescription("最新技术的不同文章");
        channel.setLink("http://www.leftso.com");
        channel.setUri("http://www.leftso.com");
        channel.setGenerator("在屋里编程");
 
        Image image = new Image();
        image.setUrl("/resources/assist/images/blog/b8fb228cdff44b8ea65d1e557bf05d2b.png");
        image.setTitle("Leftso Feed");
        image.setHeight(32);
        image.setWidth(32);
        channel.setImage(image);
 
        Date postDate = new Date();
        channel.setPubDate(postDate);
 
        Item item = new Item();
        item.setAuthor("Leftso");
        item.setLink("http://www.leftso.com/blog/64.html");
        item.setTitle("http://www.leftso.com/blog/64.html");
        item.setUri("http://www.leftso.com/blog/64.html");
        item.setComments("http://www.leftso.com/blog/64.html");
 
        com.rometools.rome.feed.rss.Category category = new com.rometools.rome.feed.rss.Category();
        category.setValue("CORS");
        item.setCategories(Collections.singletonList(category));
 
        Description descr = new Description();
        descr.setValue(
                "两者没有必然的联系,但是spring boot可以看作为spring MVC的升级版."
                        + " <a rel=\"nofollow\" href=\"http://www.leftso.com/blog/64.html/\">Spring boot 入门(一)环境搭建以及第一个应用</a>发布在 <a rel=\"nofollow\" href=\"http://www.leftso.com\">Leftso</a>.");
        item.setDescription(descr);
        item.setPubDate(postDate);
 
        channel.setItems(Collections.singletonList(item));
        //Like more Entries here about different new topics
        return channel;
    }
 
    @GetMapping(path = "/atom")
    public Feed atom() {
        Feed feed = new Feed();
        feed.setFeedType("atom_1.0");
        feed.setTitle("Leftso");
        feed.setId("http://www.leftso.com/");
 
        Content subtitle = new Content();
        subtitle.setType("text/plain");
        subtitle.setValue("最新技术的不同文章");
        feed.setSubtitle(subtitle);
 
        Date postDate = new Date();
        feed.setUpdated(postDate);
 
        Entry entry = new Entry();
 
        Link link = new Link();
        link.setHref("http://www.leftso.com/blog/64.html");
        entry.setAlternateLinks(Collections.singletonList(link));
        SyndPerson author = new Person();
        author.setName("Leftso");
        entry.setAuthors(Collections.singletonList(author));
        entry.setCreated(postDate);
        entry.setPublished(postDate);
        entry.setUpdated(postDate);
        entry.setId("http://www.leftso.com/blog/64.html");
        entry.setTitle("Spring boot 入门(一)环境搭建以及第一个应用");
 
        Category category = new Category();
        category.setTerm("CORS");
        entry.setCategories(Collections.singletonList(category));
 
        Content summary = new Content();
        summary.setType("text/plain");
        summary.setValue("两者没有必然的联系,但是spring boot可以看作为spring MVC的升级版."
                + " <a rel=\"nofollow\" href=\"http://www.leftso.com/blog/64.html/\">Spring boot 入门(一)环境搭建以及第一个应用</a>发布在 <a rel=\"nofollow\" href=\"http://www.leftso.com\">Leftso</a>.");
        entry.setSummary(summary);
 
        feed.setEntries(Collections.singletonList(entry));
        //参加这里关于不同的新话题
        return feed;
    }
}

3.3演示

运行spring boot项目的启动类,启动spring boot项目,默认情况使用的8080端口。
启动图
现在,从浏览器转到http://localhost:8080/rss和http://localhost:8080/atom,您应该可以看到RSS和Atom订阅源,以了解您添加到控制器中的主题。

RSS feed:

RSS feed
Atom Feed:
Atom Feed

 

3.5创建RSS Feed阅读器

    我们已经有很多Feed阅读器可用,但是如果您需要以编程方式使用此Feed,则可以通过使用ROAM库的这几行简单代码来完成此操作。
package net.xqlee.project;

import java.net.URL;

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

public class FeedConsumer {
	public static void main(String[] args) {

		try {
			String url = "http://localhost:8080/rss";

			try (XmlReader reader = new XmlReader(new URL(url))) {
				SyndFeed feed = new SyndFeedInput().build(reader);
				System.out.println(feed.getTitle());
				System.out.println("***********************************");
				for (SyndEntry entry : feed.getEntries()) {
					System.out.println(entry);
					System.out.println("***********************************");
				}
				System.out.println("Done");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}
这里的URL是用于RSS提要的,如果将URL更改为Atom提要,同样的代码也可以工作。
输出
这里是控制台输出feed client:
Leftso Feed
***********************************
SyndEntryImpl.comments=http://www.leftso.com/blog/64.html
SyndEntryImpl.author=Leftso
SyndEntryImpl.wireEntry=null
SyndEntryImpl.link=http://www.leftso.com/blog/64.html
SyndEntryImpl.description.mode=null
SyndEntryImpl.description.type=text/html
SyndEntryImpl.description.interface=interface com.rometools.rome.feed.synd.SyndContent
SyndEntryImpl.description.value=两者没有必然的联系,但是spring boot可以看作为spring MVC的升级版. <a rel="nofollow" href="http://www.leftso.com/blog/64.html/">Spring boot 入门(一)环境搭建以及第一个应用</a>发布在 <a rel="nofollow" href="http://www.leftso.com">Leftso</a>.
SyndEntryImpl.foreignMarkup=[]
SyndEntryImpl.updatedDate=null
SyndEntryImpl.source=null
SyndEntryImpl.title=http://www.leftso.com/blog/64.html
SyndEntryImpl.interface=interface com.rometools.rome.feed.synd.SyndEntry
SyndEntryImpl.uri=http://www.leftso.com/blog/64.html
SyndEntryImpl.enclosures=[]
SyndEntryImpl.modules[0].date=Sun Nov 12 11:57:14 CST 2017
SyndEntryImpl.modules[0].formats=[]
SyndEntryImpl.modules[0].rightsList=[]
SyndEntryImpl.modules[0].sources=[]
SyndEntryImpl.modules[0].creators[0]=Leftso
SyndEntryImpl.modules[0].subject=null
SyndEntryImpl.modules[0].description=null
SyndEntryImpl.modules[0].language=null
SyndEntryImpl.modules[0].source=null
SyndEntryImpl.modules[0].type=null
SyndEntryImpl.modules[0].title=null
SyndEntryImpl.modules[0].interface=interface com.rometools.rome.feed.module.DCModule
SyndEntryImpl.modules[0].coverages=[]
SyndEntryImpl.modules[0].descriptions=[]
SyndEntryImpl.modules[0].relation=null
SyndEntryImpl.modules[0].contributor=null
SyndEntryImpl.modules[0].rights=null
SyndEntryImpl.modules[0].publishers=[]
SyndEntryImpl.modules[0].coverage=null
SyndEntryImpl.modules[0].identifier=null
SyndEntryImpl.modules[0].creator=Leftso
SyndEntryImpl.modules[0].types=[]
SyndEntryImpl.modules[0].languages=[]
SyndEntryImpl.modules[0].identifiers=[]
SyndEntryImpl.modules[0].subjects=[]
SyndEntryImpl.modules[0].format=null
SyndEntryImpl.modules[0].dates[0]=Sun Nov 12 11:57:14 CST 2017
SyndEntryImpl.modules[0].titles=[]
SyndEntryImpl.modules[0].uri=http://purl.org/dc/elements/1.1/
SyndEntryImpl.modules[0].publisher=null
SyndEntryImpl.modules[0].contributors=[]
SyndEntryImpl.modules[0].relations=[]
SyndEntryImpl.contents=[]
SyndEntryImpl.links=[]
SyndEntryImpl.contributors=[]
SyndEntryImpl.publishedDate=Sun Nov 12 11:57:14 CST 2017
SyndEntryImpl.categories[0].taxonomyUri=null
SyndEntryImpl.categories[0].name=CORS
SyndEntryImpl.categories[0].interface=interface com.rometools.rome.feed.synd.SyndCategory
SyndEntryImpl.authors=[]
SyndEntryImpl.titleEx.mode=null
SyndEntryImpl.titleEx.type=null
SyndEntryImpl.titleEx.interface=interface com.rometools.rome.feed.synd.SyndContent
SyndEntryImpl.titleEx.value=http://www.leftso.com/blog/64.html

***********************************
Done

四.总结

    在这个例子中,我们知道我们可以轻松地将RSS和Atom feed配置到我们的spring引导项目中。 我们也看到了如何从Java代码中使用这些代码。 这就是今天的话题。 我附上完整的eclipse项目供您参考。
地址:https://www.leftso.com/article/302.html

相关阅读

在本教程中,学习从spring boot 入门应用程序创建和使用RSS和Atom提要。 您必须在各种网站上(例如我们的RSS提要)以文本或图像按钮的形式看到这一点,邀请您“通过RSS订阅”。RS...
spring boot入门,spring boot是一个崭新的spring框架分支项目,本文讲解其属性配置相关
spring boot又一个spring框架的经典项目,本文讲解spring boot入门的环境配置以及第一个项目,Spring Boot 入门教程
spring boot是一个崭新的spring框架分支项目,本文讲解基本的数据库配置
spring boot是一个崭新的spring框架分支项目,本文讲解spring boot中controller的常用注解使用
Spring Boot 入门 AOP 日志处理,这里主要讲解spring boot 中采用AOP方式进行日志的统一处理。spring 框架的处理也是一样。综合来讲,本文主要讲解了spring b...
spring boot mybatis 整合使用讲解介绍,spring boot与mybaties的使用讲解介绍。spring boot mybatis xml mapper方式的入门和通过一个...
spring boot 入门之整合spring session实现session共享。一直以来Java编程中web项目中的session共享问题都是一个很难解决的问题。接下来将讲解通过sprin...
Spring boot 入门之CORS 跨域配置详解,spring 跨域配置详解。
spring boot 入门 使用spring.profiles.active来分区配置,,在spring boot中可以存在多个环境的配置文件通过配置spring.profiles.activ...