为什么不选择基于Http的Restful

liangshan 14-08-15
    

这个随笔没说为什么要Restful,只说为什么不基于Http实现Restful。首先Http是超文本转移协议而不是控制协议。通常文档中也会使用“资源”来指代超文本。Http作为一种传输协议其所面向的本体是“资源”。资源包含很多东西,可以分为结构化的和非结构化的两种。视频、声音、图片等都是非结构化的资源,区分结构化还是非结构化的关键是目标资源是否可以被通用软件容易的使用,而视频声音图片等设计为被专用软件容易使用。结构化的数据类似关系数据库定义的数据,它是易于使用的。Http的另一个本体是“转移”,Http的一整套东西都是围绕着“资源”和“转移”这两个本体来设计的,所以是定位符Url而不是标识符Uri。Http是一种传输协议,我们可以语义通顺的说把一个资源从A地“Post”到B地,但是使用Http的Post Method或Put Method表示Create了一个用户是语义不通顺的。Web上的接口大都是控制接口,所控制的不是包罗万象的“资源”而大都是结构化的数据,并且多为实体。

所谓实体是具体本体下的一个具体事物,这个事物可能存在物理世界的真实映射也可以是完全虚构的事物。实体有一个重要属性是必须可以“标识”,也就是说必定可以区分出两个实体的不同。现在和将来在计算机系统中的实体大多是分布式实体。分散在各个节点中的实体需要数据交换,这个“交换”使用控制协议表述比使用“传输”协议更加准确。

如今基于Web的接口越来越多,多的难以控制。究其主要原因是这些接口大多面向功能设计。面向功能设计导致随着业务的变化和新功能的增加接口越来越多难以治理最终发生爆炸,一发不可收拾。基于Web的接口将会越来越多,面向协议的接口设计是大势所趋。面向协议的接口设计是什么样的呢?笼统的说,就是像众多云计算厂商选择的那样的。但某些云计算厂商的接口设计似乎缺乏理论指导。

什么是面向协议的接口设计?可以简单的表述为类似Http那样风格的接口设计。如果表述的更细一些则面向协议的接口设计有“本体”、“元素”、“动作”、“状态码”、“字典”、“实体”、“标识”、“编码”、“组织结构”等概念。其中“动作”类比Http的Method,“状态码”类比Http的StateCode。

但面向协议的接口设计中的“动作”不是Get、Put、Post等“资源”“转移”词汇而是Create、Update、Upload、Download、Compress、UnCompress、Delete、Audit等更具业务意义的“实体”“控制”词汇。面向协议的接口设计的“状态码”和“原因短语”不是Http(数据转移协议)的状态码而是更具业务意义的InvalidApiVersion、InvalidClientType、ExecuteOk、ToAudit等状态码和原因短语,在面向协议的接口设计的接口的契约上不绑定任何Http的Method和StateCode。因为面向协议的接口设计不应绑定任何Http Mehod所以Restful被排除了。

简单的说,应用程序编程接口的设计就是给出一套约束,使主体(Subject)和客体(Object)可以使用这套约束表达和理解意愿。 “表达和理解意愿”更进一步可以更简短的表达为“传递信息【信息】”。Subject和Object使用基于预先定义的语法书写的表述【Message】进行沟通或交互。
我们如何表达意愿的呢?有以下要素:
 首先, 本体是什么 Ontology
 其次, 要干什么 Action
 三, 索引客体
 四, 提供输入

一段时间以来互联网上的接口设计有向Rest吹向的趋势,这可能又将是一个错误。因为Http是传输协议不是控制协议,而互联网上的绝大部分接口是控制(结构化数据=>实体)接口。Http的本体是“资源”,资源包括非结构化的声音视频图片。可以语义通顺地说把资源从一个位置Post到另一个位置,但以Post表创建不合适。面向网络的接口设计的未来是Hecp,即超实体控制协议。当然Hecp不是标准,而是我空想的。Hecp将是一个概念框架,给出一套词汇标识一套概念并给出一个样例,当然这也是空想的,具体内容大家补充。Hecp的特点是不使用Http的Method,不使用Http的状态码,强制最佳实践。

Hecp
面向对象的行为仅有两种:命令和查询,不存在第三种情况。Hecp将命令进一步分三种:Action(行动)、Command(命令)、Event(事件)。三者在数据传输对象的结构上不做进一步区分,三者结构完全相同。

时间戳:三者均具有时间戳属性,不同的是“行动”的时间戳来自当前的宇宙上下文;命令的时间戳由客户端填入,但命令的具体执行时间由服务端决定;事件的时间戳往往是过去的也由客户端填入。

执行性质:服务端立即执行请求类型为Action的命令,周期执行请求类型为Command的命令(执行周期由服务端自定),如何处理请求类型为Event的命令由服务端自主决定(面向EventSourceType、EventSubjectCode和StateCode/ReasonPhrase编程)。

基于Hecp实现的接口只有两个方法,一个Command一个Query。
Hecp认为基于Http的Restful是错误的,而不是认为Restful是错误的。
Hecp认为服务端无需关注Http的状态码,如果传输层使用的是Http则服务端应返回的Http状态码应永远是200,不应处理任何Http的状态码。

    

1
SpeedVan
2014-08-15 13:15

重新打造标准和已存在的http标准没有根本性变化,那就没什么意义。为什么用http?若不用http,用什么?用其他有没违背初衷?请先回想,Rest为什么会出现。

liangshan
2014-08-15 14:29

2014-08-15 13:15 "@SpeedVan"的内容
重新打造标准和已存在的http标准没有根本性变化,那就没什么意义。为什么用http?若不用http,用什么?用其他有没违背初衷?请先回想,Rest为什么会出现。 ...

是这样的,api的消费端编程的时候是面向业务概念的,api的服务端提供服务的时候也是面向业务概念的。而中间的http却会被服务端和客户端分别映射为业务概念。可是如果提供一套直接就是使用业务概念书写“实体控制协议”的话用这套使用业务概念书写的名词隔绝http的名词。程序员编程的时候就不需要在脑子里想着post动作代表啥get动作代表啥了,因为在实体控制协议下:如果当前的本体(本体用来作为限界上下文)是“教师”那么动作列表就会是“讲课、上班、下班、批改作业”,而如果当前的本体是学生的话动作列表就会是“上课、交作业、写作业、考试”等。整套概念中没有http的method了。

SpeedVan
2014-08-15 21:52

2014-08-14 16:55 "@anycmd"的内容
我后来思考了一下,百度百科上所说的交差分类法可能是指的这样:比如对于一个班级的学生这个学生对象集。按照性别分会是男生、女生;按照座位的行分会是第一排、第二排……最后一排;按照成绩分会是优等生、普通生、差等生(这里需要定义“成绩”和“比较大小 ...

感觉你在用一个非Rest的东西来取代Rest,你的初衷跟Rest的初衷不一样,自然不能取代Rest。

luda
2015-07-19 11:44

结构化还是非结构化可能是相对的,同一份数据对于A来说是非结构化的但对于B来说可能就是结构化的了。看来判断一份数据是否结构化的关键是看作为施力者的主体一方是否具有和理解那份数据的元数据信息。

这样理解可能很形象,数据或者叫资源一定是空间,无论这数据描述的是什么,即使描述的是方法或行为的数据它也是空间,它一定对应的是一串01,而01就是空间原子。一份数据对于当前主体来说是否是结构化的在于当前的主体是否能识别出那个空间中的坐标、标识、指路牌信息。