REST筆記(三):一種標準的超媒體格式:Atom
前面一節中講述了REST架構風格中最核心本的要素之一:超媒體格式。雖然超媒體格式有很有用,如能被瀏覽器很好解析的HTML。但是HTML也不是萬能的。如我們在AJAX應用中,使用JSON表述格式很顯然比HTML要好。再者,我們為了實現某一特定領域而采用自定義的超媒體格式,如果消費者只需要處理表述中的一小部分,雖然我們可以通過獲取資源的表述,然后過濾出我們需要處理的資源,但這顯然不是一種好的方式。Atom社區所制定了一條深受歡迎的慣例。
目錄:
1、Atom簡介
2、Atom1.0與RSS2.0
3、Atom中基本概念介紹
4、Atom中的鏈接關系
5、.Net FCL中對Atom的實現
6、Atom的用途
1、Atom簡介
Atom:Atom聯合格式(Atom Syndication Format)的簡稱。它是 一種基于XML的超媒體格式。它提供了靈活可擴展的互操作的格式,并且因為基于XML的特點,所以它為跨平臺的應用間傳遞數據提供了很好的支持。是IETF的“建議標準”。Atom作為一種流行的超媒體格式已經被Google等廣泛使用。下圖為一Atom格式實例:

2、Atom1.0與RSS2.0
說起Atom可能有點陌生,但是對RSS都應該比較熟悉。Atom的出現彌補了RSS中的一些不足。維基百科中敘述如下:
1、RSS 2.0 可能包含文本或經過編碼的HTML內容,同時卻沒有提供明確的區分辦法;相比之下,Atom 則提供了明確的標簽(也就是typed)。
2、RSS 2.0 的 description 標簽可以包含全文或摘要(盡管該標簽的英文含義為描述或摘要)。Atom 則分別提供了 summary 和 content標簽,用以區分摘要和內容,同時 Atom 允許在summary中添加非文本內容。
3、RSS 2.0 存在多種非標準形式的應用,而 Atom 具有統一的標準,這便于內容的聚合和發現。
4、Atom 有符合XML標準的命名空間,RSS 2.0 卻沒有。
5、Atom 通過XML內置的xml:base標簽來指示相對地址(URI),RSS 2.0 則無相應的機制區分相對地址和絕對地址。
6、Atom 通過XML內置的xml:lang,而 RSS 采用自己的language標簽。
7、Atom 強制為每個條目設定唯一的ID,這將便于內容的跟蹤和更新。
8、Atom 1.0 允許條目單獨成為文檔,RSS 2.0 則只支持完整的種子文檔,這可能產生不必要的復雜性和帶寬消耗。
9、Atom 按照RFC 3339標準(ISO 8601標準的一個子集)表示時間 ,而RSS 2.0 中沒有指定統一的時間格式。
10、Atom 1.0 具有在 IANA 注冊了的 MIME 類型,而 RSS 2.0 所使用的 application/rss+xml 并未注冊。
11、Atom 1.0 標準包括一個 XML schema,RSS 2.0 卻沒有。
12、Atom 是IETF組織標準化程序下的一個開放的發展中標準,RSS 2.0 則不屬于任何標準化組織,而且它不是開放版權的。
3、Atom中基本概念介紹
3.1 提要(feed)
Atom通過列表來表示數據稱之為提要(feed).它的部分元數據說明:
id:在提要生命周期中永久的、唯一的標識符
title:提要為我們提供的可讀標題
subTitle:為提要的源信息
category:提要分類。由其term屬性的Value指定。此外有兩個可選屬性:Label、Scheme,前者表示我們可以理解的表述,后者標識了此分類所屬方案
updated:提要最新更新時間
link:獲取提要的URI
有關提要的詳細信息,可以查閱MSDN
3.2 條目(entry)
條目(entry)是構成提要(feed)的帶有時間戳數據實體。一個提要中包含一個或多個條目。雖然條目(entry)一般都是包含在提要(feed)中,但是他們都可以單獨作為可尋址的資源來被消費者使用。如下即為一個Atom提要:不管是提要(feed)還是條目(entry),都有一個通用唯一標識符:uuid(Universally Unique Indentifier)。
條目(entry)中與提要(feed)相同的部分就不多做介紹了,由于它們是一種標準的格式,所以代表的意義也大同小異。但條目(entry)有提要(feed)所沒有的content元素,用它來設置條目內容。
4、Atom中的鏈接關系
link是Atom中主要的超媒體控件,通過它就可以獲取資源的表述,供消費者使用。link有幾個重要的屬性:
1、rel:描述鏈接關系以及鏈接語義的上下文
2、href:獲取資源表述的URI
3、type:資源可能的媒體類型
雖然link中有type屬性,服務端返回給客戶端的響應的HTTP 頭信息中也有Content-Type信息。無論怎樣Content-Type信息始終是服務端返回給客戶端最權威的表述格式。但link中有type屬性依然有意義。例如:如果服務端返回給客戶端的表述中既有XML,也有JSON格式,那客戶端可以根據自身需要,選擇適當的URI來獲取資源的表述類型。
link控件的幾種鏈接關系:
self:當前提要或條目所需的資源由href所標識的URI獲取
via:標識當前提要或條目的信息來源
alternate:連接當前提要或條目的替代表述的鏈接
enclosure:表述URI獲取表述的資源的尺寸可能會比較大
related:表示href所指資源同當前提要或題目存在某種關系
per-archive:當前提要以前最近的一個提要。
next-archive:與per-archive相反。
實際應用中,如果某個客戶端掉線,等網絡恢復后,它獲取到最新的提要,并且能通過提要中的超媒體控件link 的per-archive鏈接關系一直往前遍歷,從而尋找到它最近一次處理過的提要信息;同時也能通過next-archive來往后遍歷,遍歷到最新的提要信息。這些鏈接關系值都是在IANA的鏈接關系注冊表中注冊的,已經成為一種標準的處理方式。
5、.Net FCL中對Atom的實現
在.Net FCL(FrameWork Class Library)中,我們可以使用在System.ServiceModel程序集的System.ServiceModel.Syndication命名空間中找到項目Atom相關的類,來創建我們的應用。主要的類有SyndicationFeed,SyndicationItem,SyndicationContent、Atom10FeedFormatter等。我們通過SyndicationFeed來創建提要(feed),通過SyndicationItem來創建條目(entry)。范例如下:
SyndicationFeed feed = new SyndicationFeed
{
Title = new TextSyndicationContent("feed Tile"),
LastUpdatedTime = new DateTimeOffset(DateTime.Now),
Description = new TextSyndicationContent("feed Description Content")
};
feed.Authors.Add(new SyndicationPerson("aa@gmial.com", "zhanshan", "cnblogs.com"));
feed.Language = "us-en";
feed.Generator = "test feed";
feed.Links.Add(new SyndicationLink(new Uri("http://www.rzrgm.cn/tyb1222"), "via", "linkTitle", "application/Atom+xml",1000));
feed.Categories.Add(new SyndicationCategory("blog"));
feed.Contributors.Add(new SyndicationPerson("aa@gmial.com", "zhanshan", "cnblogs.com"));
SyndicationItem item1 = new SyndicationItem("Title1",
"Microsoft may have patents, patent applications, trademarks, ...more",
new Uri("http://www.microsoft.com"))
{Summary = new TextSyndicationContent("sumary")};
SyndicationItem item2 = new SyndicationItem("Title2",
"The names of actual companies and products mentioned herein may be ...more",
new Uri("http://www.microsoft.com"))
{Summary = new TextSyndicationContent("sumary")};
List<SyndicationItem> syndicationItems = new List<SyndicationItem> {item1, item2};
feed.Items = syndicationItems;
6、Atom的用途
資源的創建與消費使用Atom是一種比較理想的方式。在Atom中,我們可以將不能以超媒體格式的資源鏈接到資源的條目中,使用<Content>的src屬性鏈接到這些資源。在REST架構中,我們可以適應Atom來獲取資源的表述,并通過它的link超媒體控件來驅動業務的執行進而轉移應用的狀態。Atom作為IETF推薦的一種標準的超媒體格式,已經廣泛應用在成千上萬個Web項目中,如Gmail。
浙公網安備 33010602011771號