上次咱們講了RSS摘要,事實上,還有一種摘要叫Atom摘要,這種摘要主要用於國外,它是RSS的一種改良版本。關於RSS摘要的信息,網上不少,就不羅列了,大致上來說:RSS的<channel>至關於Atom的<feed>,而RSS的<item>至關於Atom的<entry>.至於他們的細節的不一樣,能夠參考這篇博客: http://www.ibm.com/developerworks/cn/web/wa-syndrssatom/index.htmlhtml
理論很少說了,我想說的是,其實Apache提供了一個叫Abdera的框架,它是ATOM 聯合協議(Atom Syndication)和ATOM 發佈協議(ATOM Publication,簡稱APP)的開源實現。關於ATOM 聯合協議,它主要用來定義ATOM摘要(feed)和ATOM條目(entry)的的格式,而且聽從RFC4287規範(http://www.ietf.org/rfc/rfc4287.txt),而ATOM發佈協議,則是用REST的方式來對網上的ATOM文檔進行維護,它主要聽從RFC5023規範(http://www.ietf.org/rfc/rfc5023.txt)java
咱們這個例子很簡單,一是演示如何用Abdera框架建立Atom條目和Atom摘要,二是如何咱們建立的條目發佈到支持Atom的博客系統上。web
準備工做:apache
咱們須要下載Abdera框架:http://abdera.apache.org/#abdera.1.1.2app
此外,咱們必須註冊一個Google帳戶,而且開通了Google博客系統,好比個人Google博客系統是:http://welcome2charles.blogspot.com/。國內的用戶可能要×××,我是使用了***來演示的。框架
Part 1: Demo如何使用Abdera框架來編寫Atom Entry和Atom Feed:ide
首先,咱們編寫一個工具類來專門建立Atom條目(Entry):工具
package com.charles.learnatom; import java.util.Date; import org.apache.abdera.factory.Factory; import org.apache.abdera.model.Entry; import org.apache.abdera.parser.stax.util.FOMHelper; /** * * Description: 這個工具類能夠用來建立Atom 記錄(entry) * * @author charles.wang * @created May 10, 2012 1:05:58 PM * */ public class AtomEntryCreator { /** * * @param abderaFactory 這是abdera的文檔工廠,它用來生成某個Atom 條目(Entry) * @param updatedDate Atom Entry的更新時間 * @param title Atom Entry的標題 * @param author Atom Entry的做者 * @param link Atom Entry的連接 * @param content Atom Entry的內容部分 * @return 由abdera工廠生成的Atom Entry */ public static Entry createAtomEntry( Factory abderaFactory, Date updatedDate, String title, String author, String link, String content){ Entry entry = abderaFactory.newEntry(); //讓Feed Object Model幫你建立一個uuid entry.setId(FOMHelper.generateUuid()); entry.setUpdated(updatedDate); entry.setTitle(title); entry.addAuthor(author); entry.addLink(link); //entry.setContent(content); entry.setContentAsXhtml("<p>"+content+"</p>"); return entry; } }
而後,咱們編寫一個工具類來專門建立Atom 摘要(Feed):post
package com.charles.learnatom; import java.util.Date; import java.util.List; import org.apache.abdera.factory.Factory; import org.apache.abdera.model.Entry; import org.apache.abdera.model.Feed; import org.apache.abdera.parser.stax.util.FOMHelper; /** * * Description:這個工具類能夠用來建立Atom 摘要(feed) * * @author charles.wang * @created May 10, 2012 1:46:41 PM * */ public class AtomFeedCreator { /** * * @param abderaFactory 這是abdera的文檔工廠,它用來生成某個Atom 摘要(Feed) * @param updatedDate Atom Feed的更新時間 * @param title Atom Feed的標題 * @param author Atom Feed的做者 * @param links Atom Feed中包括的全部連接 * @param entries Atom Feed中包括的全部的條目(Entry) * @return */ public static Feed createAtomFeed( Factory abderaFactory, Date updatedDate, String title, String author, List<String> links, List<Entry> entries){ //建立一個Atom Feed 文檔 Feed feed=abderaFactory.newFeed(); //添加元信息 //讓Feed Object Model幫你建立一個uuid feed.setId(FOMHelper.generateUuid()); feed.setUpdated(updatedDate); feed.setTitle(title); feed.addAuthor(author); //由於一份摘要(Feed)有可能有多個連接,因此要依次加入Feed文檔中 for( String link:links){ feed.addLink(link); } //由於一份摘要(Feed)可能有多個條目(Entry),因此要依次加入到Feed文檔中 for(Entry entry : entries){ feed.addEntry(entry); } return feed; } }
而後咱們編寫一個驅動類,來調用這2個方法,根據咱們傳入的參數來建立相應的條目和摘要,而且打印在控制檯上:ui
public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub //建立一個Abdera的實例 Abdera abdera = new Abdera(); //建立一個Abdera工廠,這個工廠能夠用來建立atom entry文檔和atom feed文檔 Factory factory = abdera.getFactory(); //建立第一個Atom Entry文檔 String title1="Atom Entry 1"; String author1="Charles Wang"; String link1="http://welcome2charles.blogspot.com"; String content1="這是第一個用Apache Abdera框架建立的 Atom Entry "; Entry entry1 = AtomEntryCreator.createAtomEntry(factory, new Date(), title1, author1, link1, content1); //打印這個Atom Entry 文檔 //entry1.writeTo(abdera.getWriterFactory().getWriter("prettyxml"),System.out); //建立第二個Atom Entry文檔 String title2="Atom Entry 2"; String author2="Charles Wang"; String link2="http://welcome2charles.blogspot.com"; String content2="這是第二個用Apache Abdera框架建立的 Atom Entry "; Entry entry2 = AtomEntryCreator.createAtomEntry(factory, new Date(), title2, author2, link2, content2); //建立一個Atom Feed文檔,這個文檔中包含上述建立的兩個Atom Entry String feedTitle="A New Created Atom Feed"; String feedAuthor="Charles Wang"; ArrayList<String> feedLinks = new ArrayList<String> (); feedLinks.add("http://welcome2charles.blogspot.com"); feedLinks.add("http://www.blogger.com/feeds/6924231941130538538/posts/default"); ArrayList<Entry> feedEntries = new ArrayList<Entry> (); feedEntries.add(entry1); feedEntries.add(entry2); Feed feed = AtomFeedCreator.createAtomFeed(factory, new Date(), feedTitle, feedAuthor, feedLinks, feedEntries); //打印這個Atom Feed 文檔,有兩個參數,第一個是abdera自定義個格式化Writer,第二個是真實的輸出目的地 feed.writeTo(abdera.getWriterFactory().getWriter("prettyxml"),System.out); }
最終,咱們建立的條目1樣子以下:
<?xml version='1.0' encoding='UTF-8'?> <entry xmlns="http://www.w3.org/2005/Atom"> <id>urn:uuid:94ABFEBB6CF5417A281336630977803</id> <updated>2012-05-10T05:45:15.224Z</updated> <title type="text">Atom Entry 1</title> <author> <name>Charles Wang</name> </author> <link href="http://welcome2charles.blogspot.com" /> <content type="xhtml"> <div xmlns="http://www.w3.org/1999/xhtml"> <p>這是第一個用Apache Abdera框架建立的 Atom Entry </p> </div> </content> </entry>
而咱們的Feed文件由於同時包含了條目1和條目2,因此打印出的樣子以下:
<?xml version='1.0' encoding='UTF-8'?> <feed xmlns="http://www.w3.org/2005/Atom"> <id>urn:uuid:94ABFEBB6CF5417A281336630978024</id> <updated>2012-05-10T06:22:58.021Z</updated> <title type="text">A New Created Atom Feed</title> <author> <name>Charles Wang</name> </author> <link href="http://welcome2charles.blogspot.com" /> <link href="http://www.blogger.com/feeds/6924231941130538538/posts/default" /> <entry> <id>urn:uuid:94ABFEBB6CF5417A281336630977803</id> <updated>2012-05-10T06:22:57.677Z</updated> <title type="text">Atom Entry 1</title> <author> <name>Charles Wang</name> </author> <link href="http://welcome2charles.blogspot.com" /> <content type="xhtml"> <div xmlns="http://www.w3.org/1999/xhtml"> <p>這是第一個用Apache Abdera框架建立的 Atom Entry </p> </div> </content> </entry> <entry> <id>urn:uuid:94ABFEBB6CF5417A281336630978023</id> <updated>2012-05-10T06:22:58.021Z</updated> <title type="text">Atom Entry 2</title> <author> <name>Charles Wang</name> </author> <link href="http://welcome2charles.blogspot.com" /> <content type="xhtml"> <div xmlns="http://www.w3.org/1999/xhtml"> <p>這是第二個用Apache Abdera框架建立的 Atom Entry </p> </div> </content> </entry> </feed>
Part2 :利用Abdera框架和APP(Atom Publishing Protocol)吧咱們建立的條目發佈到Google Blogger 上:
咱們能夠用如下的代碼:
public static void main(String[] args) throws Exception{ //這裏略去,就是咱們建立的Entry1 ... //發表某個記錄 System.out.println("開始發佈條目到Google Blogger"); AbderaClient client= new AbderaClient(abdera); //建立一個Google登陸的認證信息憑證 //第一個是用戶名(註冊郵箱),第二個是密碼,第三個是服務名(必須是blogger) GoogleLoginAuthCredentials creds = new GoogleLoginAuthCredentials("xxx@xxx.com", "xxxxxx", "blogger"); //將憑證信息加到abdera客戶端 client.addCredentials("http://www.blogger.com/home", null, "GoogleLogin", creds); RequestOptions options = client.getDefaultRequestOptions(); options.setUseChunked(false); //發送包含咱們文章的Entry,參數有3個,一是發送的目的地,二是發送的Entry,三是可選參數 Response response = client.post( "http://welcome2charles.blogspot.com/feeds/posts/default", entry1, options); }
這段代碼中,幾個參數我要說明下:
(1) GoogleLoginAuthCredentials中傳入的帳號密碼是你的google帳號的信息,而第三個參數是服務名,由於咱們請求的是博客服務(blogger),因此這裏必須寫"blogger"。
(2) client.post()中的第一個參數,是咱們要發送的目的地,它也就是咱們的博客的feed目標地址,這個地址,咱們能夠要像下面這樣得到:先註冊Google Blogger,打開到首頁,而後右鍵選擇"view source",而後會看到以下的內容:
能夠看到<link rel="alternate" type="application/atom+xml">這個元素就表明你頁面上如何管理到Atom Feed,因此這個元素後面對應的地址(href),就是咱們所須要的, 也就是應該寫到client.post()的第一個參數中的。