《電子技術(shù)應用》
您所在的位置:首頁 > 可編程邏輯 > 設計應用 > 基于RESTful架構(gòu)的RSS訂閱服務
基于RESTful架構(gòu)的RSS訂閱服務
2015年微型機與應用第3期
董袁泉
(沙洲職業(yè)工學院,江蘇 張家港 215600)
摘要: 介紹了快速獲取信息和網(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)過程。
關鍵詞: RESTful RSS URI 聚合
Abstract:
Key words :

  摘  要: 介紹了快速獲取信息和網(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)過程。

  關鍵詞: 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所示。

001.jpg

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]:

 ?。?)資源抽象:網(wǎng)絡上的所有事物都被抽象為資源(Resource),比如圖片、音樂、視頻、文字、以及服務資源ID。在RESTful服務中,所有數(shù)據(jù)都以資源的形式表示。例如,某個組織通過其網(wǎng)站出售的產(chǎn)品詳細信息可以以資源的形式表示。每個資源應該具有唯一ID以供標識,這個唯一ID是資源URI。URI表示為:http://ReadME.com/products/product1,當用戶在客戶端應用程序中單擊以鏈接形式顯示的URI時,將向用戶顯示product1產(chǎn)品的詳細信息。

 ?。?)鏈接方法:資源的URI以鏈接的形式顯示。通過使用鏈接,用戶可以查看駐留在不同服務器或計算機上資源的相關信息。當用戶單擊鏈接時,鏈接將用戶帶到應用程序的下一網(wǎng)頁,其中顯示資源表示。這會導致應用程序狀態(tài)的更改。這使得應用程序變成動態(tài)并使用戶能夠在應用程序中或者在各種應用程序之間導航。

 ?。?)標準方法: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ù)。

 ?。?)無狀態(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組成,并不包含對資源的動作。

  (2)統(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操作。

 ?。?)更少的代碼和簡單的系統(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ù)。可以使用<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ā)布最新新聞或更新信息的最常用格式,這使用戶可以查看關于所需特定主題的最新消息。可使用聚合在網(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類。

003.jpg

  在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ù)集進行分析。

  (2)把數(shù)據(jù)集映射為ROA中的資源。

 ?。?)使用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詳細頁面。

002.jpg

5 結(jié)束語

  典型的基于SOAP的Web服務以操作為中心,每個操作接受XML文檔作為輸入,提供XML文檔作為輸出。從本質(zhì)上講,它們是RPC風格的。而在遵循RESTFul原則的ROA應用中,服務是以資源為中心的,對每個資源的操作都是標準化的HTTP方法[6]??梢钥吹?,基于RESTFul構(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.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。