`
canonical
  • 浏览: 359527 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
  REST(Representational State Transfer) 是Roy Thoms Fielding在其博士论文中所提出的一种架构风格(Architectual Style)。http://roy.gbiv.com/pubs/dissertation/top.htm  http://www.redsaga.com/opendoc/REST_cn.pdf 可以说它也体现了整个互联网架构的基本设计原则。随着AJAX等技术的发展,互联网的资源语义逐渐得以恢复,最近对于REST的讨论也热烈起来。http://www.ibm.com/developerworks/cn/web/wa-ajaxarch/
  在Fielding的论文中对REST有如下陈述:
The name “Representational State Transfer” is intended to evoke an image of how a well-designed
Web application behaves: a network of web pages (a virtual state-machine), where the
user progresses through the application by selecting links (state transitions), resulting in
the next page (representing the next state of the application) being transferred to the user
and rendered for their use.
  点击超链接之后,服务器端返回资源的某种表示(Resource Representation), 客户端的状态(Representational State)随之发生迁移(transition),在服务器端返回的表示中存在着到其他状态的迁移链接,使得我们始终自动具有进一步迁移的能力(这和 ajax中所谓返回纯粹数据其实是不同的). 这种图景其实也正是Tim Berners-Lee最早所设想的web的图景。因为REST是对互联网架构设计的一种抽象,因此所谓的Restful其实就是尽量符合现有Web标 准。从概念上说,REST所关注的主要还是分布式资源信息交换,而不是对复杂的业务逻辑进行抽象。遵循REST将会使整个互联网受益,确保路由器,缓存, 代理,浏览器,服务器等各个组件可以协同工作,它的意义并不是针对单个应用程序的。不过与witrix体系架构相对比,我们还是可以发现REST架构风格 对于一般web程序的参考价值。
   1. 通过唯一的,确定的url来标定可访问的资源。url定义了后台资源的访问界面,明确区分了浏览器和服务器两个分离的状态空间。这种两分的架构约束是 witrix平台最重要的设计原则。在witrix平台中,Jsplet, BizFlow, PageFlow,AuthMap等技术完全体现在url的精化设计上,系统中所涉及到的所有关键概念都对应于url中的明确组分。而JSF等技术通过对 象封装模糊了资源的访问界面,迫使我们只能通过一个错综复杂的对象包络来理解系统的交互过程。
   2. REST强调整个交互图景中所有需要的相关信息都是in band的,而且语义上不同的部分都对应于特定的语法上不同的部分。例如为了保证url的不透明性和稳定性,一些信息通过http协议的header来传 递。这里强调的语义自明性实际上是脱离具体知识体系的形式上的可区分性。在现有的服务器端程序中, 因为直接接触到的是已经解析好的parameter集合, 因此Witrix平台中关注的是在参数集合中识别出特定的形式结构, 这通过EngineURL对象实现.
   3. HTTP中明确区分了GET/POST/PUT/DELETE四种标准操作, 并对它们的语义进行了精确的限定. 而所谓的RPC(Remote Procedure Call)与此是不同的. RPC上承载的方法数可以是无限多的,但是这种无限多的操作反而从某种层面上说是简单的,是对称的,没有可区分性。而在REST中,在确定资源这一限制 下,我们可以区分出GET/POST/DELETE/PUT这四种有限但是不同的语义。 是否这四种语义构成完备的操作空间?从某种意义上说, 这四种操作覆盖了资源的整个生命周期, 它自然满足了某种完备性. 但是抽象意义上的完备性并不意味着它在物理层面上也是完备的. 我们都知道二维空间是完备的,但是二维描述并不是三维空间的合适表达. 在Witrix体系下,WebAction所提供的完备的操作集合包括Query, ViewDetail, Update, Add和BizAction.
BizAction是个特定的扩展,所有不便于直接归类到CRUD操作的操作都可以归类到这一Action的名 义下. Witrix架构中把CRUD看作是一个更大的Action空间的一个子空间, 对此子空间的结构进行了细致的划分, 所关注的重点是对部分信息的更明确的表达, 而不是对程序整体的建模.
   区分GET/POST/PUT/DELETE四种操作, 最重要的意义在于定义了GET和其他操作的区别. http://www.w3.org/DesignIssues/Axioms.html
 a. in HTTP, GET must not have side effects
 b. in HTTP, anything which does not have side-effects should use GET
   在GET这种语义下, 才可能建立独立的cache组件, 而正是因为cache的存在, 才使得web成为infomation space而不是computing program. 而在Witrix平台中, 很多通用机制的建立(例如精确到数据行的访问权限)都需要对于CRUD做出精细的区分, 而不仅仅是识别出GET操作.
  4. REST中虽然定义了具有概念稳定性的url, 但是因为操作集合有限,而且强调服务器端的无状态性, 因此一般认为这种结构并不是面向对象的. 不过,在我看来,面向对象首先意味着一组相关性的聚集, 实际上从语义层面上看, REST与witrix平台的jsplet框架非常接近, 最大的差别在于服务器端明确定义的thisObj---this指针. 服务器端的无状态性对于网站应用而言是必要的, 但是对于复杂的企业应用而言并不是合适的约束.
  5. 对整个互联网应用而言,URI应该是不透明的,它的结构对互联网中间应用而言应该是不暴露的. 资源的结构是与整个互联网架构无关的. 最近业内鼓吹REST的时候往往也推崇所谓beautify的url, 例如 http://www.my.com/blog/3/comment/1. 这种结构不过是维护url稳定性的一种副产品, 在我看来, 它对于REST而言并不是必需的. 不过根据这些年关系数据库应用积累的经验,识别集合和集合中的个体是一种非常通用的场景,因此我们可能规范化这种结构,甚至搜索引擎等外部组件也可能理解 这种语义,从而实现更加复杂的语义网络。在现有的所谓支持REST的web框架中, 往往支持这种规范化的url直接映射到后台的响应函数上. https://cetia4.dev.java.net/files/documents/5545/38989/cetia4_tutorial.pdf. 例如在cetia4框架中, GET /blog/3将会被映射到后台函数 String render(RenderContext context, int id)函数上. 在witrix平台中, 缺省并不采用beautify的url, 但是因为对于语法成分具有明确的定义, objectEvent=ViewDetail&id=3这样的url将映射到后台biz-flow中的action段.
<action id="ViewDetail-default"><source></source>
xml 代码
 
  1. <action id="ViewDetail-default">  
  2.  <source>  
  3.    在这里直接拿到entity对象,而不是id值  
  4.  </source>  
  5. </action>  
</action>
在action 中我们直接接触到的不是id值,而是id值相对应的实体对象本身. 对于objectEvent=Remove, 我们可能一次删除多条记录, 则在后台bizflow中action=Remove-default段将会被调用多次,每次处理一个实体. 这些自动处理机制都离不开对于标准化url组分的明确理解.
   在网站应用中, 我们一般也通过url rewrite机制来支持简化的层级url. 但是这种根据位置来确定语义成分的url格式其实也存在着很大的局限性, 在cetia4的映射中很多时候都会出现含混的情况. 而且因为资源是抽象的, 页面中的相对路径计算会出现一定的困难. 在witrix平台中, 通过tpl模板语言的标签增强机制, 我们重新定义了页面中的相对路径计算规则, 从而大大简化了资源管理问题. 在tpl中相对路径计算永远是基于当前模板文件的, 例如对于通过<c:include src="subdir/included.tpl">引入的子页面included.tpl, 在其中的 <script src="included.js" type="text/javascript"></script> 等使用相对路径的语句会在编译期被转换为使用绝对路径, 生成 <script src="/contextPath/root/subdir/included.js" type="text/javascript"></script> 等语句.
  6. 一旦url格式被规范化, 我们就可以基于它在应用程序中发展很多全局结构. 例如在cetia4中, 可以建立全局的navigation模型, 并提供了一个breadcrumb 导航栏. 这是一种全局的链接管理机制,在一定程度上实现了导航信息压缩.  但是因为其没有对象结构支撑, 与Witrix平台的PageFlow技术相比, cetia4的方式不过是非常原始的一级策略, 它对于对象生命周期的管理也是过于简陋的.http://canonical.iteye.com/blog/32552
  7. REST中强调generic interface 而不是强调custom interface. 实际上目前业内的对象化方案很多时候都沉迷于提供特定结构的构造方法, 很多面向对象框架本身就在构造各式各样的特定结构。一种通用的结构只存在于概念中,是复杂结构背后的事情。但是在很多情况下, generic interface无论在实现成本还是概念成本上都是更加低廉的. 在witrix平台中, jsplet框架所实现的对象化就是一种generic方式的,弱类型化的, 而不是强类型的对象结构的。
  8. 关于REST的另一个有趣的问题是如果大量使用HTTP内置特性,是否我们的应用将严格绑定到http协议上,不再是所谓的protocol independence。不过我们真的需要同一语义模型的不同实现吗.</c:include>
分享到:
评论
1 楼 zjq_blog 2008-06-09  
说的太抽象,看完之后好像是理解了,又好像很模糊。

相关推荐

    关于rest接口demo的详解

    关于rest接口demo的详解,里面有详细的解答和见解

    django-rest-framework 官方文档

    django-rest-framework的官方文档,可以解压缩文件后,离线使用,十分的方便,网上关于rest的资料也是几乎没有,只有官方文档参考,可以多交流交流

    关于activiti rest服务

    关于activiti rest api

    Spring MVC3 REST实例

    使用Spring MVC3基于注解的形式实现的REST小例子 部署运行: 1. 将工程导入eclipse 2. 添加tomcat属性 ...关于REST的详细说明,请参考blog http://blog.csdn.net/ziyifengfei/article/details/8185846

    Api-The-REST-Architectural-Style.zip

    Api-The-REST-Architectural-Style.zip,关于rest架构风格的文章。rest架构风格,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并将数据放弃到对象...

    Roy Thomas Fielding博士论文REST(中文版).rar

    Roy Thomas Fielding博士关于REST规则的文章,Roy Thomas Fielding博士关于REST规则的文章,Roy Thomas Fielding博士关于REST规则的文章,Roy Thomas Fielding博士关于REST规则的文章,Roy Thomas Fielding博士关于REST...

    REST与面向资源的Web开发

    什么是Web 什么是REST REST的架构约束 REST的五个关键词 REST风格架构的主要特征 REST风格架构的设计步骤 ...关于REST的一些误解 各种编程语言对于REST的支持 REST与Web服务 REST与SOA REST不适用的场合

    rest_in_peace:关于 REST 的简短演讲

    带 REST 服务研讨会的小型讲座 “面向 REST 领域的初学者的介绍以及针对小组的任务实践。” 准备工作坊 为所有部分定义 TimeBoxing 打印备忘单 打破闹钟 DART 或温度计作为输出的反馈 版本 1.0.1 附属公司 尼克、...

    理解本真的REST架构风格

    本文是“深入探索REST”专栏系列深度内容中的第二篇,它将带您领略REST架构的起源、...常常听到各种各样关于REST的说法,例如:有人说:“我们这套新的API决定不用WebService(SOAP+WSDL),而是直接使用HTTP+JSON,也

    RESTful_api --- Wikipages:一种本地RESTful api,允许访问,创建,删除和更新类似于Wikipedia的文章。 (关于REST概念的个人测试)

    RESTful_api --- Wikipages HTML | CSS | JS | NODE.JS | EXPRESS | MONGODB | MONGOOSE POSTMAN | ROBO 3T 如果在本地运行,则克隆... (基于REST的个人游戏/测试)在Postman上测试并运行。 借助Robo 3T可视化数据库。

    DZone_REST_Refcard_2011 E文

    DZone社区关于Rest的简要图示 简洁明了

    云通讯短信服务 Delphi XE10upd1 Demo by 老赵.rar

    正好自己也在开发,也看到有人在云通讯官网问是否有Delphi demo ...作为一个能同时开发 win32/win64/andorid/ios/osx的语言开发工具,Delphi表示不服……我们不就是编译的...也可以学习一下关于REST 的头验证设定的方法。

    ASP EXCEL导入SQL

    它们的新的项目分别是ApacheCXF和Axis2.Java语言也制定关于REST网络服务规范:JAX-RS:JavaAPIforRESTfulWebServices(JSR311)。相信还会出现更多与REST相关的激动人心的信息。  REST与AJAX技术  尽管AJAX技术的...

    struts2-restDmo,struts2下的rest插件小例子

    直接放到tomcat目录就可以执行,详细的说明请到http://blog.csdn.net/baozhiyao234 看关于REST的说明,开发种经常用到

    Spring MVC与JAX-RS比较与分析

    如果你还不了解REST,那这个简短的介绍将有助你快速掌握REST,此外还可以点击这里了解关于REST的更多信息。 相关厂商内容 高速下载:Adobe Flash Builder 4 简体中文正式版 for Windows 高速下载:Adobe Flash ...

    gorb, 关于类固醇- REST API,心跳,服务发现等,IPVS.zip

    gorb, 关于类固醇- REST API,心跳,服务发现等,IPVS GORB 路由和平衡这个守护进程是一个带有 REST API 接口的frontend前端。 你可以使用它来控制内核中的本地IPVS实例,从而动态地 register 虚拟服务和后端。 它还...

    solution2:一个关于 REST 服务的大学课程项目

    服务器首先,对于整个项目,我使用了一个真正的数据库。 DB 的架构在文件 db_schema.png 中可用。 为了有一个规范化的数据库,我决定只使用一个表来衡量历史和健康状况。 这意味着 HealthProfile 是通过数据库中每个...

    积分兑换系统java源码-file-rest-blog:与用于REST端点的FuseMediationRouter博客一起使用的示例代码

    积分兑换系统 java源码要运行示例,请使用 ...撰写关于 REST 的论文的 Roy Fielding 积极主张 REST 风格的概念,甚至进一步阐明了实现 REST 的不确定性。 可以找到此示例的源代码 是 Apache Camel 的企业级强化版

    Jersey关于搭建Rest服务的案例

    搭建,搭建,搭建,搭建,搭建,搭建,搭建,搭建,搭建,搭建,搭建,搭建,搭建,搭建,搭建,搭建,搭建,搭建,搭建,搭建,搭建,搭建,搭建……

Global site tag (gtag.js) - Google Analytics