基于Rest风格web服务的研究

----注:此文为转摘

摘要:Web服务从诞生到现在已有十余年历史,人们用它来解决不同平台之间的互操作问题。传统的Web服务的是基于RPC风格的,其实现技术主要包含SOAP、WS标准栈等。RPC风格的Web服务在相对封闭,用在Web这个分布的、开放的环境中将带来一些问题,如技术架构复杂、可伸缩性差等。研究的REST式风格Web服务足以解决上述问题。

关键字:Rest 、架构、web服务、HTTP、URI

引言:REST风格是由HTTP协议的编写者Roy Thomas Fielding在他的博士论文中正式提出的,一种现代Web架构模型,用来指导Web的设计、定义和部署。REST也可以说是HTTP和URI这两个Web架构基础协议背后的设计原理,基于REST风格来设计Web应用的架构,就是最大限度利用HTTP和URI潜力的最佳实践。其实当HTTP被发明出来的时候,REST就已经存在了,只是后来的Web开发模式越来越背离HTTP的本质,舍本逐末的追求了RPC模型。利用REST风格构建的Web服务可以充分利用Web的特性,解决传统的构建Web服务带来的问题。

1.Rest架构的介绍

REST(Representational State Transfer)是Roy Feilding的博士论文中提出的概念,它是Web系统体系结构设计原则的一种描述,一种基于资源的服务访问架构。Roy Feilding在他的论文中对REST的定义是:REST 的目的是决定如何使一个良好设计的Web程序向前进行,用户可以通过选择一个带有超链接的Web页面上的超链接(代表状态迁移),使得另一个Web页面(代表程序的下一个状态)返回到用户,使得Web程序能进一步运行。例如:客户请求某火车站的购票服务,返回结果的页面中包含有火车班次和时刻表两个链接,则这两个链接是对服务端提供资源的表(Representational)。得到返回结果后,客户选择一个链接来决定下一步动作,这意味着客户的状态也随着迁移。这样客户可以维护自己的程序状态。

2. REST与CRUD原则的关系

REST软件架构遵循了CRUD原则,该原则告诉我们对于资源(包括网络资源)只需要四种行为:创建(Create)、获取(Read)、更新(Update)和销毁(DELETE)就可以完成对其操作和处理了。其实世界万物都是遵循这一规律:生、变、见、灭。所以计算机世界也不例外。这个原则是源自于我们对于数据库表的数据操作:insert(生)、select(见)、update(变)和delete(灭),所以有时候CRUD也写作为RUDI,其中的I就是insert。这四个操作是一种原子操作,即一种无法再分的操作,通过它们可以构造复杂的操作过程,正如数学上四则运算是数字的最基本的运算一样。

3. 构建基于REST方式的Web服务

Web 服务技术让应用程序可以用平台独立或编程语言独立的方式相互通信。但是传统的XML- RPC 风格的Web 服务, 正逐渐受到复杂性恶魔的威胁, 称作REST 风格的Web Services 提供了更简单的替代方式。

在基于REST 方式Web系统中,所有资源都有一个URI,包括Web服务也用URI来标识。用以资源标识的URI最好是逻辑URI(例:http://www.anyshop.com/5686),而不是物理URI(http://www.anyshop.com/5686.html)。

使用逻辑URI的好处是对服务器端的资源修改不影响客户的使用。使用 HTTP的CET、POST、PUT和DELEIT 4个动作作为资源的通用接口,用户通过它们访问资源。在此,HTTP作为一个程序协议来使用,而不是只作为传送一个SOAP消息的传输协议来使用。

以某零件公司的零件仓库Web服务为例来解释REST Web服务的基本思想。部署在服务器上的零件仓库对外发布一些服务,从而客户能够:

l 获取 一 份元件清单。

l 获取某个特定元件的详细信息。

l 提交一个采购清单(OP)。

l 获取元件清单

由于 基 于 REST的Web服务可以通过一个URI来访问,因此调用一个Web服务就十分简单。顾客在订购单(Order1)里需要获得零件的列表,假设有一个Web服务PartsList实现此功能,那么使用http://www.anycorp.com/PartsList即可得到零件列表。客户只需这样调用,至于服务器端如何实现,对客户来说是透明的。因为对客户是透明的,所以服务器可以自由的修改资源而不影响客户,实现了松散藕合的特性。

客户知道使用前面的URL 后,那么服务器将返回包含零件列表的一个文档,即:

<? xml version”1.0”>

<p:Parts xmlns:p=”http://www.anycorp.com

Xmlns:xlink=”http://www.w3.org/1999/xlink”>

<Part id = “00345” xlink:href = “http://www.anycorp.com/PartsList/00345”>

<Part id = “00346” xlink:href =“http://www.anycorp.com/PartsList/00346”>

</p:Parts>

返回的文档中包含了对各个零件的链接,客户选择合适的链接可以将该链接指向的资源迁移到客户,实现客户状态的自维护,这是REST的关键特征。获取某个特定元件的详细信息

如果想要以XML形式返回每个零件详细的信息,只需在URL后加上零件编号参数,比如http://www.anycorp.com/PartsList/00345,则会返回如下的文档:

<? Xml version=”1.0”>

<p:Part xmlns:p=”http://www.parts-depot.com

Xmlns:xlink=”http://www.w3.org/1999/xlink”>

<Part-ID>00345</Part-ID>

<Name>Widget-A</Name>

<Description>This part is used within the frap assembly</Description>

<Specification xlink:href=”http://www.anycorp.com/PartsList/00345/specification”/>

<UnitCost currency=”USD”>0.10</UnitCost>

<Quantity>10</Quantity>

</p:Part>

从以上返回的数据看,这个数据又链接到更多的数据。客户可继续选择这些链接以获得更详细的数据,这正是REST的关键所在。

提交一个采购清单(OP),这个服务利用一个指向PO提交的URL。客户依照零件仓库预先定义的PO格式创建一个PO实例文档。客户将PO.xml作为HTTP POST承载的内容提交上来。PO服务响应此PO提交请求,从而客户可以随时检索、更新、编辑这个PO。PO 于是成为客户端与服务器端共享的一段信息。共享信息(PO)由服务器端指定的URL访问,并暴露为一个Web服务。

4.REST Web服务设计原则

(1) 以REST构建Web服务的关键是要正确识别作为服务的资源。

(2) 为每个资源提供URL,资源应该是名词,不是动词。

(3) 根据客户处理资源的方式分类,可以分为客户仅接收资源的表现性和客户能够修改(增加)资源。对于前者,提供HTTP GET 方法访问,对于后者,提供HTTP POST,PUT和DELETE。

(4) 所有通过HTTP CET访问的资源应该是不可更改的。即是说,这些资源仅仅向客户返回一个资源的表现性,客户调用他们不能更改它们。

(5) 没有孤立的表现性。换言之,在资源的表现性中提供链接,让客户能更深人的获取更多的信息,或者相关信息。

(6) 逐步的提供数据,不应该在一个文档里提供所有的内容,可以为更详细的信息提供链接。

因为REST是对当今Web体系结构设计原则的一种描述,所以REST的目标和原则是对当今Web中已经成功应用的要素的总结。

4. 总结

本文描述了基于REST的Web服务设计原则和特点,以及构建基于REST的Web服务的思想。通过对REST的理解,REST必然会对Web服务的体系结构产生重要的影响基于REST 的Web服务必将推进当前Web服务技术的大规模应用和进一步发展。

相关推荐