《 Restful Web Services 》读书笔记
第一章  The Programmable Web and Its Inhabitants


我在之前的公司也参与过一个REST架构的项目,本以为自己对REST的理解达到了大成的境界了,可是看了第一章,觉得自己理解的连皮毛也不够。 这一章是在The Programmable Web 的背景下,对REST式Web服务加以全面的考察,让我对REST的理解加深了一层。

一     Programmable Web
       与Programmable Web对应的是Human Web, 顾名思义, Human Web是指面向人类用户来说的web, 那么Programmable Web就是面向软件(程序)的。

        当你在浏览器里输入 [url]www.51cto.com[/url], 浏览器发出http请求, 服务器返回来一些html数据, 从而你得到了你想要或不想要的信息。 这就是Human Web。 在Ruby里有一个Ruby/Amazon库, 使用这个库可以模拟一个用户来在Amazon.com里搜索一本图书。 而用这个Ruby库写的代码返回来的数据,则是xml数据,这些是交给程序来解析,从而得到你想要的数据, 那么这种Web服务就叫Programmable Web。

       为什么要说这个Programmable Web呢 ? 因为Human Web是基于Programmable Web的, Human Web是实际上就是静态网站和Web应用构成的嘛。


二    Programmable Web的分类
      分类怎么分 ? 肯定是需要明白了事物的共性以后,才能分的。 不管是什么架构,只要是基于Web的,那和HTTP是分不开的。 所以要对HTTP来做一个概述:
      HTTP是基于文档的协议。 客户和服务器之间如果比作是用信件来交互的话,那么HTTP就是对信封格式的要求,它并不关心文档的内容。
      
完整的HTTP Request 包括:
1.HTTP方法 (HTTP method)  -    在REST的术语里可能会用HTTP verb, HTTP action

2.路径 (path) -   hostname后面的部分,比如uri是[url]http://www.51cto.com/index.html[/url],那么path就是/index.html(这本书里有时候uri就是表示路径)

3.请求报头 (request headers)

4.实体主体 (entity-body),也叫document或representation - 这好比放在信封里的文档

完整的HTTP Respnse也是一样,形式上差不多。


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

1.客户端如何把自己的意图传达给服务器,服务器怎么知道该请求是要获取数据,删除数据,还是更新数据呢?
      
       我们把这种关于对数据采取什么操作的信息叫方法信息(method infomation)。 要在Web服务里传达方法信息,一种方式是把它放在HTTP方法里, 另一种方式是把方法信息放在了其他地方,比如uri路径或者是请求文档里。  SOAP,就是第二种方式,一般把方法信息放到了请求文档和http报头里, 这就相当于信封里套了个信封, SOAP也是一种协议。 REST则是采用第一种方式。

2.客户端如何告诉服务器对哪些数据进行操作。 假如服务器已经知道客户端要删除数据了,但它怎么知道客户端删除的是哪些数据呢 ? 为什么是这些数据,而不是那些数据 ?

       我们把这种信息叫做作用域信息(scoping information)。 一个容易想到的放置作用域信息的地方是uri路径, REST是这样做的。另一种选择就是把作用域放到请求文档里(document),SOAP都是这种方式。

可以看一个例子:
[url]http://fickr.com/photos/tags/penguin[/url]
[url]http://api.fickr.com/services/rest/?method=fickr.photos.search&tags=penguin[/url]

在第一个URI里,方法信息就是GET, 作用域是 photos/tags/penguin
后一个URI里,方法信息是fickr.photos.search, 作用域是penguin, 表面看二者并没用区别。 但是第二个uri, 令HTTP 的GET方法失去了意义。 作者有一句话说的可好了:REST的目的就是为了让Programmable Web建设的更好, 更加统一,更加结构化, 并且充分利用HTTP自身的特性。


这样一来,我们就有了分类了:

REST式,面向资源架构

REST方式架构意味着, 方法信息(method information)都在HTTP方法里,面向资源的架构(ROA)意味着,作用域信息(scoping information)都在URI里。REST架构并非只有这两条要求,但是它们还是很好的经验。 一个面向资源的REST式Web服务, 通过HTTP请求的第一行(GET /search?q=rest HTTP/1.1)就基本了解客户端要干什么了。通俗的说法就是,一看信封就知道这封信的作用是什么(现实里要这样,没人敢寄信了, 只是个比喻)。

一个REST架构,为客户端可能操作的每一则数据暴露一个uri。

RPC式架构

一个RPC式服务,为每个处理远程调用的进程暴露一个uri, 一般来说这样的uri只有一个,即服务的端点(endpoint)。因为它只是信封里套了个信封。

REST-RPC混合架构

一个REST-RPC式架构,为客户端可能进行的每一个操作暴露一个uri。


一些知名的REST式面向资源的Web服务:


 提供Atom发布协议一起变形服务。
 Amazon S3(Simple Storage Service) [url]http://aws.amazon.com/s3[/url]
 yahoo!提供的大部分web服务 ([url]http://developer.yahoo.com[/url])
 许多未采用soap的,只读的web服务
 所有静态网站

与REST相关的术语:
 
SOA,  流行的东东, 使用REST会使SOA架构更加easy吧 ?
SOAP, REST的对手
 等等。。。

就此。