理解Restful Web Service(一)

摘  要:本文展示了Http协议的强大能力,如何定义什么是Restful Web Service架构以及以当今RPC式Web服务的对比,并解析了Restful Web Service架构的四个特征:可寻址性、无状态性、连通性和统一接口。

关键字:HTTP;URL;REST;Web服务

中图分类号:TP393.04文献标识码:A

AnalysisofRestfulWebServiceArchitecture

ZHAOBo-wen

(SchoolofSoftwareEngineering,TongjiUniversity,Shanghai201413)

Keywords:HTTP;URL;REST;WebService

1Http协议基础

Http是一种基于文档的协议。客户端把文档放在Http信封里,然后发给服务器;服务器作为回应,把响应文档放到Http信封里,然后发回给客户端。

以下是一个Http请求:

GET/index.htmlHTTP/1.1

Host:www.google.com

Accept:text/html

Accept-Charset:utf-8

Connection:keep-alive

Http请求信息包括以下几个部分:

HTTP方法:对于这个请求时“GET”方法。Http方法的名称,就如同编程语言的方法名称,表示客户端希望服务器如何处理这封信。

路径:是URI主机名后面的信息。对于这个请求,URI是,路径是www.google.com。路径就是信封的地址。

请求报头:是一组关键字-值对,起元数据的作用,例如向主机、接受字体等元数据信息。

实体主体或表示:就是信封里的文档。在这里GET信封里没有文档,是空的。

Http响应信息包括三个部分。Http响应代码,通知客户端的请求是成功还是失败;响应报头,跟请求报头一样,起元数据的作用;实体主体或表示,相当于信封里具体的信件文档。

2Web服务架构的分类

Http是Web服务所共有的,而Web服务之间的差别,是因为它们在两个问题上的做法不同:

一、客户端是如何把自己的意图传达给服务器的,具体地说就是客户端如何告诉服务器应该做什么样的操作。例如是获取数据、删除数据还是改写数据呢?这种对数据采取什么操作的信息,称之为方法信息。

二、客户端如何告诉服务器对哪些数据进行操作,例如服务器已知道客户端请求删除数据,但要删除那些数据呢?这种信息称为作用域信息。

2.1传统的RPCWeb服务架构

RPC(远程过程调用)式Web服务通常从客户端收到一个充满数据的信封,然后返回一个充满数据的信封。常见的信封格式是SOAP。RPC架构意味着方法信息和作用域信息都放在信封实体里。

例如一个描述XML-RPC请求的HTTP信封:

POST/RPCHTTP/1.1

HOSTwww.search.com….

<?xmlversion=”1.0”?>

<method>

<methodName>search</methodName>

</method>

在上述的RPCWeb服务调用中,无论你向服务器请求什么方法,URI永远是www.search.com,Http方法永远是POST。

2.2RestfulWeb服务架构

RestfulWeb服务是符合REST(RepresentationalStateTransfer)风格的Web服务架构,按照RoyFielding博士论文里的评判标准是符合Web特点的。

RestfulWeb服务架构意味着,方法信息都在HTTP方法里;作用域信息都在URI里。

方法信息放到HTTP方法里就是指通过GET、PUT、DELETE等标准的HTTP方法来区分获得数据、修改数据或删除数据。使web服务有统一的接口。不像RPC式的服务将方法信息放到实体里,无论客户端请求获得数据或删除数据都使用POST方法,不具有统一接口,使web服务之间的交互困难。

作用域信息放在URI里就是指无论要操作什么样的数据都通过URI获得,这样一个RestfulWebService的请求信息的第一行就能了解客户端要做什么了。

例如:GET/Report/weekHTTP/1.1就是要获得周报表数据。而RPC式则将作用域数据放到实体里,使得RPC式的客户端请求格式复杂同时也不具有可寻址性(后面会详细介绍)。

3RestfulWeb服务架构的四个特征

这里我们将阐述RestfulWeb服务架构的四个特征:可寻址性、无状态性、连通性和统一接口。

3.1RestfulWeb服务架构的资源概念

任何事物,只要具有被引用的必要,它就是一个资源。在Web服务上它至少有一个URI(统一资源标识符),URI既是资源的名称,也是资源的地址。在RestfulWeb服务架构中URI只能指示唯一一个资源,但是响应信息可以包括多个资源,例如包括一些其它资源的连接信息。

3.2可寻址性

可寻址性是指用户可以通过唯一标示的信息获得特定的资源。例如在windows浏览器中,你要察看哪个文件夹直接敲入地址,即可直接访问。例如:C:\ProgramFiles\WindowsNT就可直接访问WindowsNT文件夹。在Web服务中可寻址性就是指每一则服务都是可直接访问的,可以被添加到收藏夹里。Web是可寻址的似乎是理所当然的,可是许多Web应用却不是可寻址的。例如Gmail在线Email服务,Gmail的URI始终是http://mail.google.com/。

无论用户是什么操作,是要获得信息还是要上传信息,用户都不会看到其它URI,例如“关于狮子的邮件”这个资源就不是可寻址的。

在RestfulWeb服务中如果一个应用把资源发布出来,那么该应用就是可寻址的。因为资源是通过URI暴露的,所以一个可寻址的应用应该会为它提供的每一则信息都发布一个URI,URI的数量在RestfulwebService中是无限的。可寻址性的优点是可以让客户端灵活自如使用WebService上资源,甚至超出Web服务设计者的想象。可寻址性本身就是Web上的一大优点,在RestfulwebService中我们应当保留这个优点。

3.3无状态性

无状态性意味着每个Http请求都是完全孤立的。当客户端发一个Http请求,请求里应当包含服务器实现该请求的所有信息,不依赖于任何以前的信息。假设本次请求需要之前请求的信息,那就应当将该信息也放到本次请求里。

RestfulWebService应当遵循这样的原则,从可寻址性方面考虑无状态性。无状态性要求:服务器可能的状态也是资源,也应该有自己的URI。客户端不必为了某个资源的请求而让服务器提前进入某种状态。例如google搜索网站,打开http://www.google.com/后在输入框填入”apple”,然后点击Search.得到相应结果。用户同样可以直接输入http://www.google.com/search?hl=en&q=apple&aq=f得到搜索结果而不用先打开google主页,这就是无状态性的一种体现。

3.4连通性

表示(Representation)就是序列化的数据结构,把其中的数据取出即可丢弃。但在RestfulWebService中,表示应该是超媒体(HyperMedia),也就是说表示中不仅包含数据,还包含指向其它资源的连接。这种具有“连接”的特性,称为连通性。

连通性使服务器通过超媒体告诉客户端当前状态有哪些后续状态可以进入。例如在http://www.google.com/search?hl=en&q=apple&aq=f资源里的“下一页”连接起的就是这种推进作用——它指引你如何从当前状态进入下一个可能的状态。在RestfulWeb服务的文档中只要包含URI就可以指向本应用的其他状态,因为RestfulWebService是可寻址且无状态的应用。

3.5统一接口

在RestfulWebService中,我们对资源的操作仅限制为HTTP提供的基本操作,这里列举常用的四种方法:

?获取资源的一个表示:HttpGET。

?创建一个新资源:向一个新的URI发送HTTPPUT或向一个已有URI发送HTTPPOST。

?修改已有资源:向已有的URI发送HTTPPUT。

?删除已有资源:HTTPDELETE。

REST要求使用统一的接口,即每个服务器都以同样的方式使用HTTP接口。这样要求的意义在于:不论你对Web上哪个资源作GET请求,都意味着读取。统一接口令服务之间的交互更加容易。

参考文献:

[1]RoyThomasFieldingArchitecturalStylesandtheDesignofNetwork-basedSoftwareArchitecturesComputerScience2000.

[2]FieldingRT.PrincipledDesignoftheModernWebArchitecture.Proc.ofthe2000Intl.Conf.onSoftwareEngineering(ICSE2000),Limerick.Ireland.2000-06:407-416.

[3]LeonardRichardsonRestfulWebService[M].电子工业出版社ISBN978-7-121-062272008-5.

相关推荐