多年以来,一直以为HTTP是一个传输协议。因为TP MEANS TRANSPORTATION PROTOCOL。。。。
蠢!
它的确是一个协议。但它却不仅是一个协议。它是一个超文本传输协议。如果从最初的版本来理解它,这个解释是正确的。
但是今天不是。因为HTTP早就发展成一个MIME内容传输协议。内容种类极其繁多。这是为什么REST认为HTTP主要是一个资源传输协议的原因了。
HTTP是一个资源导向的协议。REST看中的正是HTTP的这个核心思想,以及由此带来的全部的BENEFITS。它的中心思想是,嘿,我们根本就不需要WEB SERVICE,我们已经有了非常简单且适用的通信语义。它是一个资源导向的协议。它的名字是:HTTP。我们使用WEB SERVICE进行RPC调用,目的不也是为了操纵资源吗?即然一切最终的目标不过是为了操纵资源,为什么我们放着现在的直接语义手段不用,而转去利用那些对象级(每次使用,都需要对其进行翻译------从生硬的对象方法翻译成资源操纵行为)的手段呢?
看似正确。
唯一的问题在于,我们能否视一切为资源。?
一个很简单的思路是这样的,方法 到底干了什么?每个方法都完成了一定的工作对不对?不一定对。因为方法是工作在对象级的东西,也就是说,它是代码级的东西,它只是一个形式化的东西。在具体应用中,我可能,也可能不,赋予它语义。比如,有些方法只是纯粹为其它方法的工作做准备,有些方法,则纯粹是为了使一些对象级的手段如设计模式可以工作而存在的。我们并不能解释每一个方法。也就是说,我并不能赋予每一个方法一个语义。
代码,它是一种手段。它是独立于人的意志存在的一种事物。我们提出它,使用它来解决问题。但是它不一定具有可理解性。如:电。我们彻底理解电了吗?没有。同样的问题存在于代码里面。
但是这并不能用作反对REST的论据。因为,即使每一个方法都并不一定代表了一定的语义,但是它们的目的却都具有一个:完成一定的工作。也就是说,它们必须,至少,在目的中赋予其语义。而这种语义,必须是包含了一个宾语的。只要宾语存在,资源也就存在。那么剩下的问题便只有一个了:谓语。因为在服务的语境中,主语永远都是用户。所以主语永远都不在“服务”的问题域中。
HTTP只提供了八个语义:PUT,GET,DELETE,POST,HEADER,OPTIONS,CONNECT,TRACE。其中的一些是用来修饰其它语义的。所以其总共的谓语数量是小于等于8的。
我们知道,计算机能处理的只是信息。信息当然是资源。所以宾语是没有问题的。但是对于资源,上述的谓语就足够了吗?也就是说,对于资源,我们能做的,是不是只有上述这些操作?
。。。
如果它们是不够的,那么当初设计HTTP的那些人就是白痴。
所以REST是满足的。