日期:2014-05-16  浏览次数:20558 次

RESTful架构是否适合“需授权访问的数据库型企业应用”?

RESTful架构是否适合“需授权访问的数据库型企业应用”?

?

首先,定义一下“需授权访问的数据库型企业应用”:其实也就是大多数(绝大多数?)j2ee开发人员要面对的那种应用,数据存储是一堆业务表,表的域比较多,表之间有关系;业务逻辑比较多,一部分是简单的增删改查,一部分是由简单增删改查组合而成的复杂操作,进入系统之前必须登录,只有授权的用户才允许进行业务操作(包括查看)。

?

REST、RESTful的资料看了一些,总感觉RESTful并不适合这类应用,主要依据是:

?

1、这类应用session(及背后的cookies)是必须的,服务器端多少会有一些会话State(比如"用户名"),肯定要违背REST服务器Stateless 原则。

?

2、这类应用任何Proxy Cache(及其他服务器之外的Cache)都是不允许的,因为非授权用户不可访问任何信息,因此无法利用REST强调的Cacheable优势。

?

3、这类应用面对的“数据对象”和REST中的“Resource”应该是不同的,后者偏向于表达那种无结构的对象(比例文档,图片,音视频),对其进行的操作绝大多数时候针对对象整体(既操作本身不关系对象内部的数据构成),因此可以用POST/GET/PUT/DELETE(CURD)等四个基本动词来表达;而前者大多数情况下,是复杂的、结构化的对象,对他们的操作除了整体操作,还有很多针对其局部的操作(既操作涉及对象的内部结构),四个基本动词远不够用,在不扩充动词的情况下,只能让一个动词表达多个操作,这种设计并不符合REST简单优美的声誉。

?

4、这类应用的“数据对象”之间很多时候是相关的,对某个对象的CURD操作经常同时需要对其他对象的CURD操作,如果把这些相关操作(2个以上)放在一个HTTP请求中完成,则使用四个基本动词来表达是语义不确切的;如果把这些相关操作分成多个HTTP请求,则相关操作的Transaction是无法保证的。

?

上面四点中,1、2对REST的违背是很明显的,3、4也很容易看出来,我的问题是,难道RESTful架构并不适用主流的企业应用(非企业“级”应用:-)),而只适用于像Javaeye这样的向公众提供信息服务的“资源型”网站

?


另外还有几个主题之外的RESTful疑问,一并请教:
a、现在很多论坛有一个功能:必须回复才能看到主帖,但看到和看不到时的访问URI是相同的,这种设计是否违背REST?
b、基本上论坛帖子都有访问次数统计,其实就是GET操作的时候改变了服务器State,应该也是违背REST吧?
c、只使用POST/GET是否也能实现RESTful?我看Fielding的论文中并没有提到必须使用PUT/DELETE。
d、在《RESTful Web Services》的序言中,作者写道:

?

In that first version of HTTP, cleverly disguised as a lack of features, we can see addressability and statelessness: the two basic design decisions that made HTTP an improvement on its rivals, and that keep it scalable up to today’s mega-sites. Many of the features lacking in HTTP 0.9 have since turned out to be unnecessary or counterproductive.Adding them back actually cripples the Web. Most of the rest were implemented in the 1.0 and 1.1 revisions of the protocol.
?
HTTP的第一个版本(指0.9),被聪明地伪装成功能简陋,我们可以看到可寻址性和无状态性,这两个基本的设计策略使得HTTP优于它的竞争对手,并使它在可扩展性方面能够适应今天的百万级站点。HTTP0.9中缺少的很多功能,大多数都在1.0和1.1版本中被实现,后来反而成为不必要的或者反生产力的,加上它们实际削弱了Web。


?
作者的意思是不是:POST/PUT/DELETE等其实都不是RESTful的本质,只有 GET+URI 才是RESTful的核心战斗力

?


最近为了升级7wxAop框架(自用+开源)的后端基础结构,花了很多时间做技术准备,以上是调查REST时的疑问,请这方面有经验的同学参与讨论解惑。

REST话题没有专版,不知道该发何处,先放在人比较多的JAVA版:-)。

64 楼 leebai 2008-05-08  
<div class='quote_title'>clia 写道</div>
<div class='quote_div'>
<div class='quote_title'>leebai 写道</div>
<div class='quote_div'>你的“表形性状态”我基本赞同,还有“最后一片乌云”是:<br/><br/>Representational 除了表示“形”,是不是还表示Header!、Method、URI、reponse code 等“型”的信息?</div>
<p><br/>又翻了一下论文,为追求真义,还下了英文原文来看了一下,发现论文中最难翻的就是这个“representation”了。<br/>如果“representational”可以翻成“表形性”的话,那“representation”又该如何翻?<br/>资源的:“形象”?“外形”?“表现形式”?“表形”?“表示”?</p>
<div class='quote_title'>Fielding 写道</div>
<div class='quote_div'>5.2.1.2 Representations<br/>REST components perform actions on a resource by using a representation to capture the<br/>current or intended state of that resource and transferring that representation between<br/>components.</div>
<p><br/>从“transferring that representation”来看,还是翻成“表示”更合适,但“表示性状态”又会使人犯迷糊,真是难两全啊!<br/><br/>之前想不明白,除了HTML、JPEG等以外,XML、JSON这些不具“形”的东西(不是给人看,而是给机器处理),会不会算是作者所指的“representation”呢?可能是我理解错了,作者所指的representation并没有说一定要具“形”,被之前的“表示层”这样的概念误导了,以为“representational”都是要给人看的。<br/><br/&g