000 什么是Web Service
Web Service是一种基于HTTP协议的服务,用户通过发送HTTP请求服务器上的资源,服务器也会把资源信息放在HTTP响应中返回
给请求者。它实际上是一种调用关系,只是被调用主体从本地函数变成了远端某个服务器上的服务。
什么是HTTP
001 RPC和RESTful的区别
当我们发起一个请求向服务器请求一个资源,那么有两个东西需要明确,一是方法信息,它用来说明要对数据采用什么样的操作,
比如是创建还是删除,是更新还是获取。二是作用域信息,它用来说明要对什么数据采取操作,比如是股票数据还是天气数据,是今天
的股票数据还是这一整个月的股票数据。
当明确了这两个部分之后,对于一个Web Service请求就可以确定对什么数据采取什么操作,也就完整说明了这次请求的主体和
主体上的动作。
一个RPC式的Web Service的方法信息和作用域信息通常都放在HTTP报文体内,即只是把HTTP作为一个传输协议,对于所有请求
HTTP本身无差别的对待。下是一个假想的SOAP服务的例子,可以看到在Content-type中指明了内容是soap+xml,方法信息是get,
作用域信息是people。
POST / HTTP/1.1
Host: www.somewebsite.com
Content-Type: applicatin/soap+xml
...
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:body>
<get>
<q>people</p>
</get>
</soap:body>
</soap:Envelope>
而一个RESTful的Web Service最大化的利用了HTTP协议本身,使用HTTP本身的动词GET,PUT,POST,DELETE等表示方法
信息,同时将作用域信息放在URL里。下面是一个RESTful的例子,使用HTTP本身的GET来描述方法信息,将作用域信息放在URL里,
相较于上面的SOAP的方式,整个请求信息简单,规整了许多,这也是RESTful的一个优点。
GET people/ HTTP/1.1
HOST: www.somewebsite.com
...
其中报文体为空
002 面向资源的架构
实际上REST本身不是一个架构,确切的来讲它是一组设计原则。而REST的服务本身就是面向资源,所以这里讲面向资源的架构。在
面向资源的架构里面有几个重要的概念:
首先,什么是**资源**?实际上RESTful的Web Service提供的一切服务都是资源,比如一个文档,一份地图,一个数据,总之就
是任何具有被引用必要的事物都可以看作资源。而资源通过URI的方式暴露出来,供客户端访问,每个资源与一个URI唯一对应。
然后就是如何对资源进行**表示**?即请求返回什么样的数据。资源的表示只是关于资源当前状态的一些数据,例如对于同一份文
档,可能会有word版,pdf版,html版可以访问,但是实际上的数资源都是一样的只是表示的不同。
除此之外,面向资源的构架还有以下四个重要的特性
1.可寻址性
可寻址性实际上是Web应用的最大优点,它令客户端可以灵活自由地使用网站。如果一个Web Service是不可寻址的,那么用户就
无法用标准的规则对它进行访问。
2.无状态性
无状态性是HTTP协议本身的特性,它意味着每个HTTP请求都是完全孤立的。当客户端发出一个HTTP请求时,请求里包含服务器实
现该请求所需要的全部信息,服务器不依赖任何请求提供的信息。假设本次请求需要之前某个请求提供的信息,那么客户端应当把那个
信息也包括在本次请求里。
也就是说对于同一个URI,以相同的访问条件,不管访问多少次,返回的结果都应该是相同的(不考虑服务器数据自身变动的情况
下),每一个URI就对应了服务的一个状态,请求结束后服务器都会回到初始状态。
3.连通性
我们平常使用的互联网的各个网站之间使用链接的方式连接起来的,一个网页中会有指向其他页面的超链接,通过点击这些超链接
就可以继续访问接下来的页面。
对于Web Service来说也是这样,返回的不止有数据,还有指向其他数据的链接,这种“具有链接”的特性叫做联通性。资源间的联
通性越好,资源间的关系就越清晰就越易于使用。
4.统一接口
统一接口实际上是为了对RESTful Web Service进行规范化,如果不进行这个统一,虽然大家都是用HTTP本身的动词作为操作方
法,但是可能你用GET获取数据,我用HEAD获取数据,对客户端来说无法用一致的方式对数据进行获取。
HTTP提供了四种基本方法,用于四种最常见的操作。
- 获取资源的表示:HTTP GET
- 创建一个新资源:向一个新的URI发送HTTP PUT,或者像一个已有的URI发送POST
- 修改一个资源:向已有的URI发送HTTP PUT
- 删除已有资源:HTTP DELETE
003 设计RESTful Service的一般步骤
1. 规划数据集
2. 把数据集划分为资源
3. 用URI为该资源命名
4. 暴露一个统一接口的子集
5. 设计来自客户端的表示
6. 设计发送给客户端的表示
7. 用超链接和表单把该资源和已有资源联系起来
8. 考虑可能出现的错误情况