概述
在豆瓣等网站里,经常会看到如下订阅Button:
本文记录一下相关概念学习成果。
Feed
Feed:消息来源,一种资料格式,网站通过它将最新资讯传播给用户。用户能够订阅某网站的前提条件是网站有提供Feed。Feed被很多会经常更新内容的网站采用,如:博客网站、内容网站、新闻网站。
RSS
将Feed汇流于一处称为聚合(aggregation),用于聚合的软件称为聚合器(aggregator)。
Really Simple Syndication,简易信息聚合,是一种消息来源格式规范,用以发布经常更新数据的网站,如博客文章、新闻、音频或视频的网摘。
RSS文件,又称做摘要、网摘、更新、频道,包含全文或节选文字,再加上一定的属性数据。能够使发行者自动地发布数据,同时也使读者能更够定期更新他们喜欢的网站或是聚合不同网站的网摘。
标准的XML档式可允许信息在一次发布后通过不同的程序阅览。用户借由将网摘输入RSS阅读器或是用鼠标点取浏览器上指向订阅程序的RSS小图标之URI来订阅网摘。
RSS缩写可以是以下三种中任一种:
- Really Simple Syndication:RSS 2.0
- RDF(Resource Description Framework)Site Summary:RSS 0.91,1.0
- Rich Site Summary:RSS 0.9 and 1.0
示例
RSS文件是一个XML,根节点是一个带有版本号的<rss>
节点,根节点以下是一个单一的<channel>
节点。<channel>
下可以有任意多个<item>
,一个item表示一个具体的订阅项目,如文章、新闻。
实例文件:
<?xml version="1.0"?><rss version="2.0"><channel><title>Liftoff News</title><link>http://liftoff.msfc.nasa.gov/</link><description>Liftoff to Space Exploration.</description><language>en-us</language><pubDate>Tue, 10 Jun 2003 04:00:00 GMT</pubDate><lastBuildDate>Tue, 10 Jun 2003 09:41:01 GMT</lastBuildDate><docs>http://blogs.law.harvard.edu/tech/rss</docs><generator>Weblog Editor 2.0</generator><managingEditor>editor@example.com</managingEditor><webMaster>webmaster@example.com</webMaster><item><title>Star City</title><link>http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp</link><description>How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia's <a href="http://howe.iki.rssi.ru/GCTC/gctc_e.htm">Star City</a>.</description><pubDate>Tue, 03 Jun 2003 09:39:21 GMT</pubDate><guid>http://liftoff.msfc.nasa.gov/2003/06/03.html#item573</guid></item></channel>
</rss>
RSS规范
RSS规范的主要版本:
- RSS 0.91:是一个精简的RSS形式,由网景公司所发行,同时也是原创的排行第一的版本编号,由Dave Winer从Userland软件所制作。网景公司的版本现在被称为Rich Site Summary,即RDF格式,相对而言比较不方便使用。
- RSS 0.92:更容易与Winer的RSS 0.91及其他版本兼容,和RSS 0.90不兼容。
- RSS 2.0:主要的改变在这个版本里使用伸的机制。
RSS阅读器
专门用来订阅网站Feed更新的软件,一般被称为Feed阅读器、RSS阅读器、新闻阅读器等。RSS阅读器会定期检阅是否有更新,并拉取到本地供用户阅读。
根据平台(Windows或Mac)、App(iOS或Android)不同,RSS阅读器有很多很多:
- irreader
- Reeder 4
Atom
借鉴各种版本RSS的使用经验,被许多的聚合工具广泛使用在发布和使用上。Atom供稿格式设计作为RSS的替代品;而Atom出版协定用来取代现有的多种发布方式(如Blogger API和LiveJournal XML-RPC Client/Server Protocol)。Google提供的多种服务正在使用Atom,如Google Data API(GData)。
Atom是IETF的建议标准,包括两个标准:
- Atom供稿格式:Atom Syndication Format,用于网站消息来源,基于XML的文档格式,RFC 4287;
- Atom出版协定:Atom Publishing Protocol,简称AtomPub或APP,用于新增及修改网络资源,基于HTTP协议,RFC 5023。
Atom vs RSS
发展Atom的动机在于广泛应用RSS 2.0时所遇到的问题。为降低开发支持Web聚合应用的难度,下面列出Atom 1.0所克服的RSS 2.0几个主要问题:
- RSS 2.0可能包含文本或经过编码的HTML内容,却没有提供明确的区分办法;而Atom则提供明确的标签(typed)。
- RSS 2.0的description标签可以包含全文或摘要(尽管该标签的英文含义为描述或摘要)。Atom则分别提供summary和content标签,用以区分摘要和内容,允许在summary中添加非文本内容。
- RSS 2.0存在多种非标准形式的应用,而Atom具有统一的标准,这便于内容的聚合和发现。
- Atom有符合XML标准的命名空间,RSS 2.0却没有。
- Atom通过XML内置
xml:base
标签来指示相对地址(URI),RSS 2.0则无相应的机制区分相对地址和绝对地址。 - Atom通过XML内置
xml:lang
,而RSS采用自己的language标签。 - Atom强制为每个条目设定唯一的ID,这将便于内容的跟踪和更新。
- Atom 1.0允许条目单独成为文档,RSS 2.0则只支持完整的种子文档,这可能产生不必要的复杂性和带宽消耗。
- Atom按照RFC 3339标准(ISO 8601标准子集)表示时间 ,而RSS 2.0中没有指定统一的时间格式。
- Atom 1.0具有在IANA注册的MIME类型,而RSS 2.0所使用的
application/rss+xml
并未注册。 - Atom 1.0标准包括一个XML schema,RSS 2.0却没有。
- Atom是IETF组织标准化程序下的一个开放的发展中标准,RSS 2.0则不属于任何标准化组织,且不是开放版权。
ROME
参考官网以及GitHub,ROME是一个Java框架,可用于RSS及Atom两类Feed。Rome支持RSS各版本:0.90、0.91、0.92、0.93、0.94、1.0和2.0,及Atom 0.3、1.0版本。
引入依赖:
<dependency><groupId>com.rometools</groupId><artifactId>rome</artifactId><version>2.1.0</version>
</dependency>
实战
发布RSS:
public static void publish() throws IOException, FeedException {SyndContent desc = new SyndContentImpl();desc.setType("text/html");desc.setValue("ES系列");SyndCategory category = new SyndCategoryImpl();category.setName("ES系列");List<SyndCategory> categories = List.of(category);SyndEntry entry = new SyndEntryImpl();entry.setTitle("ES系列");entry.setLink("https://blog.csdn.net/lonelymanontheway/category_12594356.html");entry.setDescription(desc);entry.setCategories(categories);SyndFeed feed = new SyndFeedImpl();feed.setFeedType("rss_1.0");feed.setTitle("johnny CSDN blog");feed.setLink("https://blog.csdn.net/lonelymanontheway");feed.setDescription("rome rss test");feed.setEntries(List.of(entry));Writer writer = new FileWriter("xyz.xml");SyndFeedOutput syndFeedOutput = new SyndFeedOutput();syndFeedOutput.output(feed, writer);writer.close();
}
订阅RSS
public static void query() throws IOException, FeedException {URL feedSource = new URL("https://www.douban.com/feed/subject/36686001/reviews");SyndFeedInput input = new SyndFeedInput();SyndFeed feed = input.build(new XmlReader(feedSource));log.info("feed:{}", feed);
}
参考
- 好用的RSS阅读器