摘 要: 介绍了快速获取信息和网站内容的最新更新的一种新技术——简易信息聚合技术(RSS)的基本原理和主要功能;分析了Windows Communication Foundation RESTful架构在资源调用、特定环境下服务集成、数据传输等方面的优势。结合WCF分布式网络的开发工具,详细阐述了在.NET平台下对RSS技术的融合和支持,并通过实例进一步说明.NET平台对RSS源的解析和实现过程。
关键词: RESTful;RSS;URI;聚合
0 引言
随着网络的发展,作为分布式技术的Web服务越来越多地得到应用。为此,许多应用程序和服务使用SOAP协议,该协议将数据从本机语言格式转换为应用程序和服务都能够理解的标准格式(XML)。当客户端应用程序使用SOAP协议与WCF服务通信时,数据以SOAP包的形式发送给服务器,服务器接收包,对它们进行解析,并解释存储在其中的数据。然后服务器处理数据并将结果以SOAP包的形式返回给客户端应用程序。如果数据量很大,这将影响客户端和服务器之间通信的速度,还将增加客户端和服务器上的负载。因此这些类型的服务可能不适合需要频繁传输实时数据的应用程序。在这种情况下,可通过实现RESTful服务使延迟降到最低,该服务使网站可更快地响应用户请求而不需要考虑信息的安全性。
REST(Representational State Transfer)是Roy Fielding提出的一个描述互联系统架构风格的名词。Web本质上由各种各样的资源组成,资源由URI唯一标识,浏览器将展示出该资源的一种表现方式,或者一种表现状态。如果用户在该页面中定向到指向其他资源的链接,则将访问该资源,并表现出它的状态,这意味着客户端应用程序随着每个资源表现状态的不同而发生状态转移。REST风格的Web Services技术的出现,给推广和应用Web Services带来了新的活力。在大数据来回传输的交换中,RESTful表现了一定的优势[1]。以上两种服务的架构如图1所示。
1 RESTful服务及其优势
1.1 RESTful概述
Web环境下,在REST架构风格下设计的面向服务的体系结构SOA(Service-Oriented Architecture,SOA)称为RESTful服务[2],RESTful服务强调的是资源及标识,因此在面向资源整合的集成系统中可以发挥一定的优势。
RESTful服务使用HTTP协议与客户端应用程序通信。HTTP协议从Web服务器检索网页并将页面交付给Web浏览器。这不需要将数据序列化和反序列化为标准格式,从而能够快速响应用户请求而不影响服务器的性能。
REST代表表述性状态转移。在REST架构中,每一项都称为一个资源,资源是用统一资源标识符(URI)表示的,URI唯一标识每个资源并提供资源地址。资源可通过链接进行访问,当用户在浏览器中通过URL地址访问资源时,将返回资源(如sport.html)的表示,该表示将客户端应用程序置于一种状态。当用户单击资源(如sport.html)中的某个超链接时,将返回另一资源表示,新的表示将客户端应用程序置于另一状态,更改了先前状态,通过这种方式,客户端应用程序的状态将随每个资源的表示而更改。
1.2 RESTful服务的设计原则
REST架构是针对Web应用而设计的,其目的是降低开发的复杂性,提高系统的可伸缩性。RESTful提出了如下设计准则[3]:
(1)资源抽象:网络上的所有事物都被抽象为资源(Resource),比如图片、音乐、视频、文字、以及服务资源ID。在RESTful服务中,所有数据都以资源的形式表示。例如,某个组织通过其网站出售的产品详细信息可以以资源的形式表示。每个资源应该具有唯一ID以供标识,这个唯一ID是资源URI。URI表示为:http://ReadME.com/products/product1,当用户在客户端应用程序中单击以链接形式显示的URI时,将向用户显示product1产品的详细信息。
(2)链接方法:资源的URI以链接的形式显示。通过使用链接,用户可以查看驻留在不同服务器或计算机上资源的相关信息。当用户单击链接时,链接将用户带到应用程序的下一网页,其中显示资源表示。这会导致应用程序状态的更改。这使得应用程序变成动态并使用户能够在应用程序中或者在各种应用程序之间导航。
(3)标准方法:RESTful服务使用HTTP协议与客户端应用程序通信。当用户在Web浏览器的地址栏中输入URL时,针对URI所指向网页的请求将传输到Web服务器。Web服务器接受请求并将页面交付给浏览器。浏览器通过HTTP方法应答网页的请求。这些方法是标准方法,允许浏览器与Web服务器交互。此外,这些方法允许用户在数据库服务器中检索、插入、更新和删除数据。一些Http方法如下:
Post:向Web服务器提交要处理的数据。
Get:请求网页。
Put:用于通过Web传输文件。
Delete:用于删除存储在数据库服务器中的数据。
(4)带有多种表示的资源:通过开发RESTful服务,可以各种格式(如XML,JSON,.ASPX和纯文本)显示数据,方法是以多种方式表示资源,例如:http://.../product1.xml,http://.../product1.json。在上述URI中,以多种方式表示了资源product1的详细信息,这使构建在各种平台上的客户端应用程序能够理解和使用RESTful服务发送的数据。
(5)无状态通信:RESTful服务以无状态方式以客户端应用程序通信。一旦用户请求另一资源,RESTful服务即更改状态。无状态通信增加了服务的可伸缩性以同时处理多个客户端的请求。
1.3 RESTful服务的特点
RESTful应用系统是一个面向资源的系统,具有如下特点[4]:
(1)简明的URI:RESTURI代表资源,其结构由控制器的名称和资源的id组成,并不包含对资源的动作。
(2)统一接口:REST要求使用统一的接口,统一接口独立于资源的URI。任何对资源的操作行为都是通过HTTP协议来实现:获取资源的一个表示用HTTPGET;向一个新的URI发送HTTPPUT或向一个已有URI发送HTTPPOST创建一个新资源;修改已有资源用HTTPPUT;删除已有资源用HTTPDELETE。
(3)资源可以有多种表示方法:对于控制器的同一个action,可以返回给客户端html、xml或RSS不同格式的内容,依赖于客户端的调用方式。
(4)面向CRUD的控制器:所谓CRUD就是Create、Read、Update和Delete的简写。每个控制器都对应某个资源的CRUD操作。
(5)更少的代码和简单的系统设计。
2 使用RESTful服务的数据格式
RESTful服务可以用各种数据格式显示数据,这些格式是使用不同方式(例如XML文档、JavaScript文件和聚合订阅源)表示的,要使用RESTful服务,需要了解不同的数据格式。RESTful服务允许以下列格式显示数据:XML、JSON、RSS、Atom等。
2.1 XML数据
XML是用于传输驻留在不同位置的数据应用程序的数据格式。当用户单击以XML格式显示数据的链接时,将向用户显示以标记形式显示数据的XML文档。要以XML格式显示数据,需要编写以下代码:
[WebGet(ResponseFormat=WebMessageFormat.Xml)]
2.2 JSON数据
JavaScript对象表示法(JSON)是轻量级数据交换格式,用于表示对象和数组的一种基于文本的人可阅读的格式。JSON格式主要由启用了AJAX的Web应用程序用于通过网络传输数据。当用户单击JSON格式显示数据的链接时,将向用户显示用于数据的JSON文档。要以JSON格式显示数据,需要编写以下代码:
[WebGet(ResponseFormat=WebMessageFormat.Json)]
2.3 RSS数据
简易信息聚合(RSS)是一种Web订阅源标准,使用该标准可以以标准化格式频繁发布更新内容,例如博客、新闻文章、音频和视频。它包含全文本或摘要文本。除了文本外,它还包含诸如发布日期和作者之类的元数据。可以使用<rss version=”2.0”>标记用于显示RSS格式的数据,<channel>元素表示数据源。<channel>元素包含<title>、<link>和<description>元素,这些元素描述数据源。每个RSS的开始为XML版本声明,接下来是<rss version=2.0>、<channel>、<title>、<description>等标签,分别为RSS版本说明、频道声明、频道标题、频道描述[5]。
在频道标签(<channel>)里又包含项目(<item>)列表,每个项目一般包含三个信息:标题、说明、链接,分别在<title>、<description>、<link>标签描述。还允许其他的信息,例如日期(<pubDate>)、创建者的名字(<author>)等。上述的<channel>、<item>两层结构即构成完整的RSS源。
2.4 Atom数据
Atom是在Web上以订阅源的形式显示数据的另一种Web订阅源标准。Atom格式大多用于Web内容。<feed xmlns=”http://www.w2.org/2005/Atom”>标记用于显示Atom订阅源格式的数据。RSS和Atom是在网站上显示或发布最新新闻或更新信息的最常用格式,这使用户可以查看关于所需特定主题的最新消息。可使用聚合在网站上发布内容。聚合是在网站上广播内容的方式,要在服务中实现聚合,WCF提供了聚合API,通过这些API包含各种类,可以以RSS或Atom格式显示内容。
3 .NET平台下实现RESTful服务的RSS数据的聚合
聚合RSS(也叫聚合内容,Really Simple Syndication)是在线共享内容的一种简易方式。通常在时效性比较强的内容上使用RSS订阅能更快速获取信息,网站提供RSS输出,有利于让用户获取网站内容的最新更新。
在聚合中,数据通过Web订阅源显示,该订阅源包含一组标准特性(例如标题、URL和描述)。这些特性描述Web订阅源将在Web上显示的内容。
聚合架构提供聚合API,能够在Web上显示Web订阅源。聚合API是包含订阅源数据的用户界面,也可以使用聚合API执行各种任务,例如查询聚合详细信息,聚合API提供各种类,能够以RSS或ATOM格式显示Web订阅源,表1列出了.NET提供的一些聚合API类。
在WCF中,Web订阅源是以RSS或Atom格式返回订阅源的方法。当客户端应用程序实现聚合的RESTful服务时,会以RSS或Atom格式将Web订阅源返回给客户端应用程序。
4 RESTful架构下RSS订阅服务的实现
本文以一个汽车信息查询服务网站为例简述汽车信息查询订阅服务的实现过程。汽车分销商要频繁访问各种汽车型号的详细信息,由于数据库连接问题,分销商常常无法访问详细信息。因此,创建一个RESTful服务来确保最佳性能并在服务器应用程序中托管服务,在服务中实现聚合以便不依赖于数据库服务器就可提供各种汽车型号的详细信息。
在使用面向资源的体系架构(Resource-Oriented Architecture,ROA)进行设计时,需要把真实的应用需求转化成ROA中的资源,遵循以下的步骤:
(1)对需求的数据集进行分析。
(2)把数据集映射为ROA中的资源。
(3)使用URI命名每一资源。
(4)对ROA中的每个资源设计其表述性状态Representational。
(5)用hypermedia links表述资源间的联系。
4.1 托管服务端应用程序
在服务端应用程序中主要包括一些ASPX页面,如M001.aspx、M002.aspx、M003.aspx等,其中包含了各种汽车型号的详细信息,这些页面都是比较简单的动态网页,实现较为简单,此处不再赘述。然后在IIS中新建虚拟目录并定义一个别名如QueryCarDetailsClientApp,把汽车信息发布到IIS中。
4.2 创建服务器应用程序
开发工具采用VS2010,新建控制台应用程序RestFulSevice,然后在项目中添加引用,选择组件System.ServiceModel和System.ServiceModel.Web。以下给出创建Web订阅源并在RESTful服务中实现聚合的主要代码:
[ServiceContract]
public interface IService
{
[OperationContract]
[WebGet]
Rss20FeedFormatter GetCarDetails();
}
public class Service:IService
{
public Rss20FeedFormatter GetCarDetails()
//实现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);}
}
创建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}",
((TextSyndicationContent)item.Summary).Text); }
Console.WriteLine("Press<Enter>to
quit...");
Console.ReadLine();
svcHost.Close();}
……
保存并编译RestFulService项目。
4.3 在客户端执行并验证服务器应用程序
执行RestFulService应用程序,浏览者在客户端借助于支持RSS的阅读软件(IE7.0以上版本的浏览器)打开这个RSS源链接(http://192.168.1.101:8000/Service/GetCarDetails),即能订阅网站提供的RSS源。图2为IE9.0浏览器打开RSS源的界面。单击Model One链接,将出现汽车M001详细页面。
5 结束语
典型的基于SOAP的Web服务以操作为中心,每个操作接受XML文档作为输入,提供XML文档作为输出。从本质上讲,它们是RPC风格的。而在遵循RESTFul原则的ROA应用中,服务是以资源为中心的,对每个资源的操作都是标准化的HTTP方法[6]。可以看到,基于RESTFul构建的系统其扩展能力要强于SOAP,并且伴随着Web Site as Web Services发展的趋势,基于RESTFul架构的设计和实现,具有简单性和强扩展性,有理由相信,RESTFul将会成为Web服务的一个重要应用。
在服务器性能越来越好的今天,网站服务器已完全能够高速生成动态RSS源。RSS订阅提供的是一种经济、实用的Web订阅源标准,已被越来越多的网站采用。使用RSS订阅源可以快速获取信息,网站提供RSS输出,有利于用户获得网站内容的最新更新。但是本系统提供的RESTful服务没有考虑到信息授权、安全传输和统一检索以及动态生成RSS源等问题,这将有待更进一步的研究。
参考文献
[1] 马青霞,孙梅.基于RESTFUL服务的分布式遗传算法[J].计算机工程,2011,37(24):164-166.
[2] 马青霞,高立辉.利用RESTFUL实现面向资源的服务集成[J].金陵科技学院学报,2012,28(4):27-31.
[3] 李斌.基于Ruby on Rails的铁路旅客伤亡管理系统的设计与实现[D].成都:西南交通大学,2010.
[4] 潘冰.面向资源的RESTful Web应用研究[J].微计算机应用,2010,31(7):38-43.
[5] 张冬平,郭东珲.采用C#实现RSS订阅服务[J].计算机与现代化,2011(3):140-142.
[6] 叶辉.面向电子商务的混搭应用技术研究[D].北京:北京邮电大学,2009.