摘 要: 介紹了快速獲取信息和網(wǎng)站內(nèi)容的最新更新的一種新技術(shù)——簡易信息聚合技術(shù)(RSS)的基本原理和主要功能;分析了Windows Communication Foundation RESTful架構(gòu)在資源調(diào)用、特定環(huán)境下服務(wù)集成、數(shù)據(jù)傳輸?shù)确矫娴膬?yōu)勢。結(jié)合WCF分布式網(wǎng)絡(luò)的開發(fā)工具,詳細(xì)闡述了在.NET平臺下對RSS技術(shù)的融合和支持,并通過實(shí)例進(jìn)一步說明.NET平臺對RSS源的解析和實(shí)現(xiàn)過程。
關(guān)鍵詞: RESTful;RSS;URI;聚合
0 引言
隨著網(wǎng)絡(luò)的發(fā)展,作為分布式技術(shù)的Web服務(wù)越來越多地得到應(yīng)用。為此,許多應(yīng)用程序和服務(wù)使用SOAP協(xié)議,該協(xié)議將數(shù)據(jù)從本機(jī)語言格式轉(zhuǎn)換為應(yīng)用程序和服務(wù)都能夠理解的標(biāo)準(zhǔn)格式(XML)。當(dāng)客戶端應(yīng)用程序使用SOAP協(xié)議與WCF服務(wù)通信時,數(shù)據(jù)以SOAP包的形式發(fā)送給服務(wù)器,服務(wù)器接收包,對它們進(jìn)行解析,并解釋存儲在其中的數(shù)據(jù)。然后服務(wù)器處理數(shù)據(jù)并將結(jié)果以SOAP包的形式返回給客戶端應(yīng)用程序。如果數(shù)據(jù)量很大,這將影響客戶端和服務(wù)器之間通信的速度,還將增加客戶端和服務(wù)器上的負(fù)載。因此這些類型的服務(wù)可能不適合需要頻繁傳輸實(shí)時數(shù)據(jù)的應(yīng)用程序。在這種情況下,可通過實(shí)現(xiàn)RESTful服務(wù)使延遲降到最低,該服務(wù)使網(wǎng)站可更快地響應(yīng)用戶請求而不需要考慮信息的安全性。
REST(Representational State Transfer)是Roy Fielding提出的一個描述互聯(lián)系統(tǒng)架構(gòu)風(fēng)格的名詞。Web本質(zhì)上由各種各樣的資源組成,資源由URI唯一標(biāo)識,瀏覽器將展示出該資源的一種表現(xiàn)方式,或者一種表現(xiàn)狀態(tài)。如果用戶在該頁面中定向到指向其他資源的鏈接,則將訪問該資源,并表現(xiàn)出它的狀態(tài),這意味著客戶端應(yīng)用程序隨著每個資源表現(xiàn)狀態(tài)的不同而發(fā)生狀態(tài)轉(zhuǎn)移。REST風(fēng)格的Web Services技術(shù)的出現(xiàn),給推廣和應(yīng)用Web Services帶來了新的活力。在大數(shù)據(jù)來回傳輸?shù)慕粨Q中,RESTful表現(xiàn)了一定的優(yōu)勢[1]。以上兩種服務(wù)的架構(gòu)如圖1所示。
1 RESTful服務(wù)及其優(yōu)勢
1.1 RESTful概述
Web環(huán)境下,在REST架構(gòu)風(fēng)格下設(shè)計的面向服務(wù)的體系結(jié)構(gòu)SOA(Service-Oriented Architecture,SOA)稱為RESTful服務(wù)[2],RESTful服務(wù)強(qiáng)調(diào)的是資源及標(biāo)識,因此在面向資源整合的集成系統(tǒng)中可以發(fā)揮一定的優(yōu)勢。
RESTful服務(wù)使用HTTP協(xié)議與客戶端應(yīng)用程序通信。HTTP協(xié)議從Web服務(wù)器檢索網(wǎng)頁并將頁面交付給Web瀏覽器。這不需要將數(shù)據(jù)序列化和反序列化為標(biāo)準(zhǔn)格式,從而能夠快速響應(yīng)用戶請求而不影響服務(wù)器的性能。
REST代表表述性狀態(tài)轉(zhuǎn)移。在REST架構(gòu)中,每一項都稱為一個資源,資源是用統(tǒng)一資源標(biāo)識符(URI)表示的,URI唯一標(biāo)識每個資源并提供資源地址。資源可通過鏈接進(jìn)行訪問,當(dāng)用戶在瀏覽器中通過URL地址訪問資源時,將返回資源(如sport.html)的表示,該表示將客戶端應(yīng)用程序置于一種狀態(tài)。當(dāng)用戶單擊資源(如sport.html)中的某個超鏈接時,將返回另一資源表示,新的表示將客戶端應(yīng)用程序置于另一狀態(tài),更改了先前狀態(tài),通過這種方式,客戶端應(yīng)用程序的狀態(tài)將隨每個資源的表示而更改。
1.2 RESTful服務(wù)的設(shè)計原則
REST架構(gòu)是針對Web應(yīng)用而設(shè)計的,其目的是降低開發(fā)的復(fù)雜性,提高系統(tǒng)的可伸縮性。RESTful提出了如下設(shè)計準(zhǔn)則[3]:
?。?)資源抽象:網(wǎng)絡(luò)上的所有事物都被抽象為資源(Resource),比如圖片、音樂、視頻、文字、以及服務(wù)資源ID。在RESTful服務(wù)中,所有數(shù)據(jù)都以資源的形式表示。例如,某個組織通過其網(wǎng)站出售的產(chǎn)品詳細(xì)信息可以以資源的形式表示。每個資源應(yīng)該具有唯一ID以供標(biāo)識,這個唯一ID是資源URI。URI表示為:http://ReadME.com/products/product1,當(dāng)用戶在客戶端應(yīng)用程序中單擊以鏈接形式顯示的URI時,將向用戶顯示product1產(chǎn)品的詳細(xì)信息。
?。?)鏈接方法:資源的URI以鏈接的形式顯示。通過使用鏈接,用戶可以查看駐留在不同服務(wù)器或計算機(jī)上資源的相關(guān)信息。當(dāng)用戶單擊鏈接時,鏈接將用戶帶到應(yīng)用程序的下一網(wǎng)頁,其中顯示資源表示。這會導(dǎo)致應(yīng)用程序狀態(tài)的更改。這使得應(yīng)用程序變成動態(tài)并使用戶能夠在應(yīng)用程序中或者在各種應(yīng)用程序之間導(dǎo)航。
(3)標(biāo)準(zhǔn)方法:RESTful服務(wù)使用HTTP協(xié)議與客戶端應(yīng)用程序通信。當(dāng)用戶在Web瀏覽器的地址欄中輸入URL時,針對URI所指向網(wǎng)頁的請求將傳輸?shù)絎eb服務(wù)器。Web服務(wù)器接受請求并將頁面交付給瀏覽器。瀏覽器通過HTTP方法應(yīng)答網(wǎng)頁的請求。這些方法是標(biāo)準(zhǔn)方法,允許瀏覽器與Web服務(wù)器交互。此外,這些方法允許用戶在數(shù)據(jù)庫服務(wù)器中檢索、插入、更新和刪除數(shù)據(jù)。一些Http方法如下:
Post:向Web服務(wù)器提交要處理的數(shù)據(jù)。
Get:請求網(wǎng)頁。
Put:用于通過Web傳輸文件。
Delete:用于刪除存儲在數(shù)據(jù)庫服務(wù)器中的數(shù)據(jù)。
?。?)帶有多種表示的資源:通過開發(fā)RESTful服務(wù),可以各種格式(如XML,JSON,.ASPX和純文本)顯示數(shù)據(jù),方法是以多種方式表示資源,例如:http://.../product1.xml,http://.../product1.json。在上述URI中,以多種方式表示了資源product1的詳細(xì)信息,這使構(gòu)建在各種平臺上的客戶端應(yīng)用程序能夠理解和使用RESTful服務(wù)發(fā)送的數(shù)據(jù)。
?。?)無狀態(tài)通信:RESTful服務(wù)以無狀態(tài)方式以客戶端應(yīng)用程序通信。一旦用戶請求另一資源,RESTful服務(wù)即更改狀態(tài)。無狀態(tài)通信增加了服務(wù)的可伸縮性以同時處理多個客戶端的請求。
1.3 RESTful服務(wù)的特點(diǎn)
RESTful應(yīng)用系統(tǒng)是一個面向資源的系統(tǒng),具有如下特點(diǎn)[4]:
?。?)簡明的URI:RESTURI代表資源,其結(jié)構(gòu)由控制器的名稱和資源的id組成,并不包含對資源的動作。
?。?)統(tǒng)一接口:REST要求使用統(tǒng)一的接口,統(tǒng)一接口獨(dú)立于資源的URI。任何對資源的操作行為都是通過HTTP協(xié)議來實(shí)現(xiàn):獲取資源的一個表示用HTTPGET;向一個新的URI發(fā)送HTTPPUT或向一個已有URI發(fā)送HTTPPOST創(chuàng)建一個新資源;修改已有資源用HTTPPUT;刪除已有資源用HTTPDELETE。
?。?)資源可以有多種表示方法:對于控制器的同一個action,可以返回給客戶端html、xml或RSS不同格式的內(nèi)容,依賴于客戶端的調(diào)用方式。
?。?)面向CRUD的控制器:所謂CRUD就是Create、Read、Update和Delete的簡寫。每個控制器都對應(yīng)某個資源的CRUD操作。
?。?)更少的代碼和簡單的系統(tǒng)設(shè)計。
2 使用RESTful服務(wù)的數(shù)據(jù)格式
RESTful服務(wù)可以用各種數(shù)據(jù)格式顯示數(shù)據(jù),這些格式是使用不同方式(例如XML文檔、JavaScript文件和聚合訂閱源)表示的,要使用RESTful服務(wù),需要了解不同的數(shù)據(jù)格式。RESTful服務(wù)允許以下列格式顯示數(shù)據(jù):XML、JSON、RSS、Atom等。
2.1 XML數(shù)據(jù)
XML是用于傳輸駐留在不同位置的數(shù)據(jù)應(yīng)用程序的數(shù)據(jù)格式。當(dāng)用戶單擊以XML格式顯示數(shù)據(jù)的鏈接時,將向用戶顯示以標(biāo)記形式顯示數(shù)據(jù)的XML文檔。要以XML格式顯示數(shù)據(jù),需要編寫以下代碼:
[WebGet(ResponseFormat=WebMessageFormat.Xml)]
2.2 JSON數(shù)據(jù)
JavaScript對象表示法(JSON)是輕量級數(shù)據(jù)交換格式,用于表示對象和數(shù)組的一種基于文本的人可閱讀的格式。JSON格式主要由啟用了AJAX的Web應(yīng)用程序用于通過網(wǎng)絡(luò)傳輸數(shù)據(jù)。當(dāng)用戶單擊JSON格式顯示數(shù)據(jù)的鏈接時,將向用戶顯示用于數(shù)據(jù)的JSON文檔。要以JSON格式顯示數(shù)據(jù),需要編寫以下代碼:
[WebGet(ResponseFormat=WebMessageFormat.Json)]
2.3 RSS數(shù)據(jù)
簡易信息聚合(RSS)是一種Web訂閱源標(biāo)準(zhǔn),使用該標(biāo)準(zhǔn)可以以標(biāo)準(zhǔn)化格式頻繁發(fā)布更新內(nèi)容,例如博客、新聞文章、音頻和視頻。它包含全文本或摘要文本。除了文本外,它還包含諸如發(fā)布日期和作者之類的元數(shù)據(jù)。可以使用<rss version=”2.0”>標(biāo)記用于顯示RSS格式的數(shù)據(jù),<channel>元素表示數(shù)據(jù)源。<channel>元素包含<title>、<link>和<description>元素,這些元素描述數(shù)據(jù)源。每個RSS的開始為XML版本聲明,接下來是<rss version=2.0>、<channel>、<title>、<description>等標(biāo)簽,分別為RSS版本說明、頻道聲明、頻道標(biāo)題、頻道描述[5]。
在頻道標(biāo)簽(<channel>)里又包含項目(<item>)列表,每個項目一般包含三個信息:標(biāo)題、說明、鏈接,分別在<title>、<description>、<link>標(biāo)簽描述。還允許其他的信息,例如日期(<pubDate>)、創(chuàng)建者的名字(<author>)等。上述的<channel>、<item>兩層結(jié)構(gòu)即構(gòu)成完整的RSS源。
2.4 Atom數(shù)據(jù)
Atom是在Web上以訂閱源的形式顯示數(shù)據(jù)的另一種Web訂閱源標(biāo)準(zhǔn)。Atom格式大多用于Web內(nèi)容。<feed xmlns=”http://www.w2.org/2005/Atom”>標(biāo)記用于顯示Atom訂閱源格式的數(shù)據(jù)。RSS和Atom是在網(wǎng)站上顯示或發(fā)布最新新聞或更新信息的最常用格式,這使用戶可以查看關(guān)于所需特定主題的最新消息??墒褂镁酆显诰W(wǎng)站上發(fā)布內(nèi)容。聚合是在網(wǎng)站上廣播內(nèi)容的方式,要在服務(wù)中實(shí)現(xiàn)聚合,WCF提供了聚合API,通過這些API包含各種類,可以以RSS或Atom格式顯示內(nèi)容。
3 .NET平臺下實(shí)現(xiàn)RESTful服務(wù)的RSS數(shù)據(jù)的聚合
聚合RSS(也叫聚合內(nèi)容,Really Simple Syndication)是在線共享內(nèi)容的一種簡易方式。通常在時效性比較強(qiáng)的內(nèi)容上使用RSS訂閱能更快速獲取信息,網(wǎng)站提供RSS輸出,有利于讓用戶獲取網(wǎng)站內(nèi)容的最新更新。
在聚合中,數(shù)據(jù)通過Web訂閱源顯示,該訂閱源包含一組標(biāo)準(zhǔn)特性(例如標(biāo)題、URL和描述)。這些特性描述Web訂閱源將在Web上顯示的內(nèi)容。
聚合架構(gòu)提供聚合API,能夠在Web上顯示W(wǎng)eb訂閱源。聚合API是包含訂閱源數(shù)據(jù)的用戶界面,也可以使用聚合API執(zhí)行各種任務(wù),例如查詢聚合詳細(xì)信息,聚合API提供各種類,能夠以RSS或ATOM格式顯示W(wǎng)eb訂閱源,表1列出了.NET提供的一些聚合API類。
在WCF中,Web訂閱源是以RSS或Atom格式返回訂閱源的方法。當(dāng)客戶端應(yīng)用程序?qū)崿F(xiàn)聚合的RESTful服務(wù)時,會以RSS或Atom格式將Web訂閱源返回給客戶端應(yīng)用程序。
4 RESTful架構(gòu)下RSS訂閱服務(wù)的實(shí)現(xiàn)
本文以一個汽車信息查詢服務(wù)網(wǎng)站為例簡述汽車信息查詢訂閱服務(wù)的實(shí)現(xiàn)過程。汽車分銷商要頻繁訪問各種汽車型號的詳細(xì)信息,由于數(shù)據(jù)庫連接問題,分銷商常常無法訪問詳細(xì)信息。因此,創(chuàng)建一個RESTful服務(wù)來確保最佳性能并在服務(wù)器應(yīng)用程序中托管服務(wù),在服務(wù)中實(shí)現(xiàn)聚合以便不依賴于數(shù)據(jù)庫服務(wù)器就可提供各種汽車型號的詳細(xì)信息。
在使用面向資源的體系架構(gòu)(Resource-Oriented Architecture,ROA)進(jìn)行設(shè)計時,需要把真實(shí)的應(yīng)用需求轉(zhuǎn)化成ROA中的資源,遵循以下的步驟:
?。?)對需求的數(shù)據(jù)集進(jìn)行分析。
?。?)把數(shù)據(jù)集映射為ROA中的資源。
(3)使用URI命名每一資源。
(4)對ROA中的每個資源設(shè)計其表述性狀態(tài)Representational。
?。?)用hypermedia links表述資源間的聯(lián)系。
4.1 托管服務(wù)端應(yīng)用程序
在服務(wù)端應(yīng)用程序中主要包括一些ASPX頁面,如M001.aspx、M002.aspx、M003.aspx等,其中包含了各種汽車型號的詳細(xì)信息,這些頁面都是比較簡單的動態(tài)網(wǎng)頁,實(shí)現(xiàn)較為簡單,此處不再贅述。然后在IIS中新建虛擬目錄并定義一個別名如QueryCarDetailsClientApp,把汽車信息發(fā)布到IIS中。
4.2 創(chuàng)建服務(wù)器應(yīng)用程序
開發(fā)工具采用VS2010,新建控制臺應(yīng)用程序RestFulSevice,然后在項目中添加引用,選擇組件System.ServiceModel和System.ServiceModel.Web。以下給出創(chuàng)建Web訂閱源并在RESTful服務(wù)中實(shí)現(xiàn)聚合的主要代碼:
[ServiceContract]
public interface IService
{
[OperationContract]
[WebGet]
Rss20FeedFormatter GetCarDetails();
}
public class Service:IService
{
public Rss20FeedFormatter GetCarDetails()
//實(shí)現(xiàn)RSS2.0格式的類
{
SyndicationFeed feed=new SyndicationFeed("Luxury Drive-Car Details","Car Details", null);
SyndicationItem item1=new SyndicationItem("Model One","This is the content for Model One",new Uri("http://192.168.1.101/Query CarDetailsClientApp/M001.aspx"),"ItemOneID",DateTime.Now);
…//item2,item3的代碼與item1類似,此處不再贅述
List<SyndicationItem>items=new List<SyndicationItem>();
items.Add(item1);
……
feed.Items=items;
return new Rss20FeedFormatter(feed);}
}
創(chuàng)建Web訂閱源之后,需要編寫以下代碼段在Web上顯示訂閱源,在Main()方法中輸入以下代碼:
Uri baseAddress=new Uri("http://192.168.1.101:8000/Service");
WebServiceHost svcHost=new WebServiceHost(typeof(Service),baseAddress);
try
{ svcHost.Open();
XmlReader reader=XmlReader.Create("http://192.168.1.101:8000/Service/GetCarDetails");
SyndicationFeed feed=SyndicationFeed.
Load(reader);
foreach(SyndicationItem item in feed.
Items)
{ Console.WriteLine("Title:{0}",
item.Title.Text);
Console.WriteLine("Summary:{0}",
?。ǎ═extSyndicationContent)item.Summary).Text); }
Console.WriteLine("Press<Enter>to
quit...");
Console.ReadLine();
svcHost.Close();}
……
保存并編譯RestFulService項目。
4.3 在客戶端執(zhí)行并驗證服務(wù)器應(yīng)用程序
執(zhí)行RestFulService應(yīng)用程序,瀏覽者在客戶端借助于支持RSS的閱讀軟件(IE7.0以上版本的瀏覽器)打開這個RSS源鏈接(http://192.168.1.101:8000/Service/GetCarDetails),即能訂閱網(wǎng)站提供的RSS源。圖2為IE9.0瀏覽器打開RSS源的界面。單擊Model One鏈接,將出現(xiàn)汽車M001詳細(xì)頁面。
5 結(jié)束語
典型的基于SOAP的Web服務(wù)以操作為中心,每個操作接受XML文檔作為輸入,提供XML文檔作為輸出。從本質(zhì)上講,它們是RPC風(fēng)格的。而在遵循RESTFul原則的ROA應(yīng)用中,服務(wù)是以資源為中心的,對每個資源的操作都是標(biāo)準(zhǔn)化的HTTP方法[6]??梢钥吹?,基于RESTFul構(gòu)建的系統(tǒng)其擴(kuò)展能力要強(qiáng)于SOAP,并且伴隨著Web Site as Web Services發(fā)展的趨勢,基于RESTFul架構(gòu)的設(shè)計和實(shí)現(xiàn),具有簡單性和強(qiáng)擴(kuò)展性,有理由相信,RESTFul將會成為Web服務(wù)的一個重要應(yīng)用。
在服務(wù)器性能越來越好的今天,網(wǎng)站服務(wù)器已完全能夠高速生成動態(tài)RSS源。RSS訂閱提供的是一種經(jīng)濟(jì)、實(shí)用的Web訂閱源標(biāo)準(zhǔn),已被越來越多的網(wǎng)站采用。使用RSS訂閱源可以快速獲取信息,網(wǎng)站提供RSS輸出,有利于用戶獲得網(wǎng)站內(nèi)容的最新更新。但是本系統(tǒng)提供的RESTful服務(wù)沒有考慮到信息授權(quán)、安全傳輸和統(tǒng)一檢索以及動態(tài)生成RSS源等問題,這將有待更進(jìn)一步的研究。
參考文獻(xiàn)
[1] 馬青霞,孫梅.基于RESTFUL服務(wù)的分布式遺傳算法[J].計算機(jī)工程,2011,37(24):164-166.
[2] 馬青霞,高立輝.利用RESTFUL實(shí)現(xiàn)面向資源的服務(wù)集成[J].金陵科技學(xué)院學(xué)報,2012,28(4):27-31.
[3] 李斌.基于Ruby on Rails的鐵路旅客傷亡管理系統(tǒng)的設(shè)計與實(shí)現(xiàn)[D].成都:西南交通大學(xué),2010.
[4] 潘冰.面向資源的RESTful Web應(yīng)用研究[J].微計算機(jī)應(yīng)用,2010,31(7):38-43.
[5] 張冬平,郭東琿.采用C#實(shí)現(xiàn)RSS訂閱服務(wù)[J].計算機(jī)與現(xiàn)代化,2011(3):140-142.
[6] 葉輝.面向電子商務(wù)的混搭應(yīng)用技術(shù)研究[D].北京:北京郵電大學(xué),2009.