利用Apache Abdera 框架建立和發佈Atom Entry, Atom Feed

 上次咱們講了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()的第一個參數中的。

相關文章
相關標籤/搜索