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