- 浏览: 467097 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (371)
- Java (44)
- Flex (25)
- Design Pattern / UML (5)
- JVM (14)
- Software Engineer (4)
- Testing (30)
- Web Backend (60)
- Linux (7)
- Database (11)
- SOA (28)
- English (6)
- FX (5)
- SAP Support (25)
- SAP Development (5)
- SAP Impl & Oprn (8)
- Articles (15)
- Music (4)
- Recipe (14)
- Multi-thread (4)
- Lucene (2)
- CS basic / Algorithm (12)
- Tour (3)
- C C++ (21)
- Others (10)
- Code Repository C++ (1)
- Code Repository Java (1)
- Code Repository Algorithm (1)
- Code Repository SQL (1)
- Web Frontend (4)
最新评论
-
xiangxm:
Java 强引用、 软引用、 弱引用、虚引用 -
nml-lyb:
123
Mule 的第一个例子 -
nml-lyb:
http://www.baidu.com
Mule 的第一个例子 -
white___ant:
...
Java 强引用、 软引用、 弱引用、虚引用 -
joeyon:
...
Java NIO介绍
REST(Representational State Transfer)是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。REST提出了一些设计概念和准则:
网络上的所有事物都被抽象为资源(resource);
每个资源对应一个唯一的资源标识(resource identifier);
通过通用的连接器接口(generic connector interface)对资源进行操作;
对资源的各种操作不会改变资源标识;
所有的操作都是无状态的(stateless)。
对于当今最常见的网络应用来说,resource identifier是url,generic connector
interface是HTTP,第4条准则就是我们常说的url不变性。这些概念中的resouce最容易使人产生误解。resouce所指的并不是数
据,而是数据+特定的表现形式(representation),这也是为什么REST的全名是Representational State
Transfer的原因。举个例子来说,"本月卖得最好的10本书"和"你最喜欢的10本书"在数据上可能有重叠(有一本书即卖得好,你又喜欢),甚至完
全相同。但是它们的representation不同,因此是不同的resource。
REST之所以能够简化开发,是因为其引入的架构约束,比如Rails
1.2中对REST的实现默认把controller中的方法限制在7个:index、show、new、edit、create、update和
destory,这实际上就是对CURD的实现。更进一步讲,Rails(也是当今大部分网络应用)使用HTTP作为generic
connector interface,HTTP则把对一个url的操作限制在了4个之内:GET、POST、PUT和DELETE。
REST之所以能够提高系统的可伸缩性,是因为它强制所有操作都是stateless的,这样就没有context的约束,如果要做分布式、做集群,就不
需要考虑context的问题了。同时,它令系统可以有效地使用pool。REST对性能的另一个提升来自其对client和server任务的分
配:server只负责提供resource以及操作resource的服务,而client要根据resource中的data和
representation自己做render。这就减少了服务器的开销。
既然REST有这样的好处,那我们应该义无反顾地拥抱它啊!目前一些大牛(像DHH)都已经开始投入到了REST的世界,那我们这些人应该做什么或者说思考写什么你呢?我觉得我们应该思考两个问题:
如何使用REST; REST和MVC的关系。
第一个问题假设REST是我们应该采用的架构,然后讨论如何使用;第二个问题则要说明REST和当前最普遍应用的MVC是什么关系,互补还是取代?
我们先来谈谈第一个问题,如何使用REST。我感觉,REST除了给我们带来了一个崭新的架构以外,还有一个重要的贡献是在开发系统过程中的一种新的思维
方式:通过url来设计系统的结构。根据REST,每个url都代表一个resource,而整个系统就是由这些resource组成的。因此,如果
url是设计良好的,那么系统的结构就也应该是设计良好的。对于非高手级的开发人员来说,考虑一个系统如何架构总是一个很抽象的问题。敏捷开发所提倡的
Test Driven
Development,其好处之一(我觉得是最大的好处)就是可以通过testcase直观地设计系统的接口。比如在还没有创建一个class的时候就
编写一个testcase,虽然设置不能通过编译,但是testcase中的方法调用可以很好地从class使用者的角度反映出需要的接口,从而为
class的设计提供了直观的表现。这与在REST架构中通过url设计系统结构非常类似。虽然我们连一个功能都没有实现,但是我们可以先设计出我们认为
合理的url,这些url甚至不能连接到任何page或action,但是它们直观地告诉我们:系统对用户的访问接口就应该是这样。根据这些url,我们
可以很方便地设计系统的结构。
让我在这里重申一遍:REST允许我们通过url设计系统,就像Test Driven Development允许我们使用testcase设计class接口一样。
OK,既然url有这样的好处,那我们就着重讨论一下如何设计url。网络应用通常都是有hierarchy的,像棵大树。我们通常希望url也能反映出
资源的层次性。比如对于一个blog应用:/articles表示所有的文章,/articles/1表示id为1的文章,这都比较直观。遗憾的是,网络
应用的资源结构永远不会如此简单。因此人们常常会问这样一个问题:RESTful的url能覆盖所有的用户请求吗?比如,login如何
RESTful?search如何RESTful?
从REST的概念上来看,所有可以被抽象为资源的东东都可以使用RESTful的url。因此对于上面的两个问题,如果login和search可以被抽
象为资源,那么就可以使用RESTful的url。search比较简单,因为它会返回搜索结果,因此可以被抽象为资源,并且只实现index方法就可以
了(只需要显示搜索结果,没有create、destory之类的东西)。然而这里面也有一个问题:search的关键字如何传给
server?index方法显然应该使用HTTP
GET,这会把关键字加到url后面,当然不符合REST的风格。要解决这个问题,可以把每次search看作一个资源,因此要创建create和
index方法,create用来在用户点击"搜索"按钮是通过HTTP
POST把关键字传给server,然后index则用来显示搜索结果。这样一来,我们还可以记录用户的搜索历史。使用同样的方法,我们也可以对
login应用REST,即每次login动作是一个资源。
现在,我们来复杂一些的东东。如何用url表达"category为ruby的article"?一开始可能想到的是/category/ruby
/articles,这种想法很直观。但是我觉得里面的category是不需要的,我们可以直接把"/ruby"理解为"category是
ruby",也就是说"ruby"出现的位置说明了它指的就是category。OK,/ruby/articles,单单从这个url上看,我们能获得
多少关于category的信息呢?显然category隐藏在了url后面,这样做到底好不好,应该是仁者见仁,智者见智了。对于如何表达
category这样的东西,我还没想出很好的方式,大家有什么好idea,可以一起讨论。
另外还有一种url形式,它对应到程序中的继承关系。比如product是一个父类,book和computer是其子类。那么所有产品的url应该是
/products,所有书籍的url应该是/books,所有电脑的url应该是/computers。这一想法就比较直观了,而且再次验证了url可
以帮助我们进行设计的论点。
让我再说明一下我的想法:如果每个用户需求都可以抽象为资源,那么就可以完全使用REST。
由此看来,使用REST的关键是如何抽象资源,抽象得越精确,对REST的应用就越好。因此,如何改变我们目前根深蒂固的基于action的思想是最重要的。
有了对第一个问题的讨论,第二个问题就容易讨论多了。REST会取代MVC吗?还是彼此是互补关系(就像AOP对于OOP)?答案是It
depends!如果我们可以把所有的用户需求都可以抽象为资源,那么MVC就可以推出历史的舞台了。如果情况相反,那么我们就需要混合使用REST和
MVC。
当然,这是非常理想的论断。可能我们无法找到一种方法可以把所有的用户需求都抽象为资源,因为保证这种抽象的完整性(即真的是所有需求都可以)需要形式化
的证明。而且即使被证明出来了,由于开发人员的能力和喜好不同,MVC肯定也会成为不少人的首选。但是对于希望拥抱REST的人来说,这些都没有关系。只
要你开发的系统所设计的问题域可以被合理地抽象为资源,那么REST就会成为你的开发利器。
所以,所有希望拥抱REST的朋友们,赶快训练自己如何带上资源的眼镜看世界吧,这才是REST的核心所在。
http://space.91.com/704613886/blog/14090.html
发表评论
-
Mule 例子:以axis做为inbound,传递复杂类型,MuleClient UMOMessage
2009-09-22 16:29 2999这个例子出自:http://raymondhekk.iteye ... -
Axis 客户端代码
2009-09-22 16:16 1858import org.apache.axis.client.C ... -
Mule, AquaLogic ESB 学习阶段性总结 (2009.9.21)
2009-09-21 14:53 1382下面这段文字为转载:http://dragonetzhou.i ... -
Mule 的 Loan Broker 例子的 PPT (经典的ESB的例子)
2009-09-21 14:26 1839http://wiki.springside.org.cn/d ... -
Aqualogic Service Bus 的第三个例子 (消息流进阶)
2009-09-18 17:34 1026P87 的那个例子 1、已经发布的Web Servic ... -
Aqualogic Service Bus 的第二个例子 (消息流基础)
2009-09-17 15:15 1225消息流节点类型: 启动节点、路由节点、分支节点、管道对节点 ... -
Aqualogic Service Bus 的第一个例子 (入门)
2009-09-17 11:17 1580本例子出自 《SOA权威指南》 第三章中的那个入门例子。 亲 ... -
Mule Transformers
2009-09-07 14:58 1719Using Transformers [ Configuri ... -
XMPP协议简介
2009-09-07 14:15 1790XMPP协议简介 XMPP(Ext ... -
Staged Event Driven Architecture (SEDA) 介绍
2009-08-31 10:29 2464一、前言 二、当前流行的两种并发处理编程模型 ... -
Camel 入门
2009-08-27 18:25 900前段时间和一些朋友聊 ... -
OSGi 入门
2009-08-27 18:15 704还没开始入... -
Mule 的消息路由
2009-08-27 17:53 1248Mule的消息路由 作者 J ... -
Mule 的第二个例子
2009-08-27 15:17 2966这个例子 主要 演示了 web service 作为 inbo ... -
Geronimo入门
2009-08-25 16:23 955http://www.matrix.org.cn/resour ... -
Apache Mina 入门
2009-08-25 13:31 11892007 年 12 月 24 日 本文将通过一个简单的问 ... -
CXF -- JAXB
2009-08-21 10:38 5588JAXB : Java API for XML Bindin ... -
CXF -- JAX-WS
2009-08-21 10:01 1367JAX-WS Java API for XML Web Se ... -
CXF的第一个例子 -- 深入剖析
2009-08-20 20:43 1722Web Service 的 Client 和 Server 端 ... -
CXF的第一个例子 (附 wsdl详解)
2009-08-20 16:52 30581、在eclipse中 创建一个java project。 ...
相关推荐
用REST架构(Representational StateTransfer, 表述性状态转移),实现安防设备(如摄像机、数字录像机、网络录像机 等)与平台或客户端软件之间的通信。 ISAPI,全称为Intelligent Security Application Programming ...
REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,...
Ruby on Rails是一个突然流行...本文介绍Rails中的Web服务,重点放在一个名为Representational State Transfer (REST)的策略上。本文介绍了如何在Ruby on Rails中添加REST风格的Web服务,并从Ruby和Java代码调用服务。
REST的全称是REpresentational State Transfer,它利用传统Web特点,提出 提出一个既适于客户端应用又适于服务端的应用的、统一架构,极大程度上统一及简化了网站架构设计。 目前在三种主流的Web服务实现方案中,...
REST架构网页开发.Representational State Transfer (REST) is a style of software architecture for distributed systems such as the World Wide Web.
REST 是英文 Representational State Transfer 的缩写,有中文翻译为“具象状态传输”。REST 这个术语是由 Roy Fielding 在他的博士论文 《 Architectural Styles and the Design of Network-based Software ...
REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端...
然后我介绍了表述性状态转移(Representational State Transfer,REST)的架构风格,并且描述了如何使用REST来指导现代Web架构的设计和开发。 REST强调组件交互的可伸缩性、接口的通用性、组件的独立部署、以及用来...
REST (Representational State Transfer)是代表状态传输的缩写。它代表了分布式超媒体系统的体系结构风格,该风格是Roy Field在他的论文中定义的。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,...
Representational State Transfer,翻译是”表现层状态转化”。 面向资源是REST最明显的特征,对于同一个资源的一组不同的操作。资源是服务器上一个可命名的抽象概念,资源是以名词为核心来组织的,首先关注的是名词...
"activiti-rest.zip" 文件看起来是一个包含 Activiti REST API 相关组件的压缩包,它使得开发人员可以通过 RESTful(Representational State Transfer)接口与 Activiti 服务进行交互,这在分布式系统和跨平台集成中...
**REST(Representational State Transfer)基础** REST,全称Representational State Transfer,是一种网络应用程序的设计风格和开发方式,基于HTTP协议,主要用于Web服务的构建。它强调的是资源的概念,通过URI...
SSH(Secure Shell)和REST(Representational State Transfer)是两种在IT行业中广泛使用的技术,尤其在构建分布式系统和网络通信时。SSH主要用于提供安全的远程登录和其他安全网络服务,而REST是一种软件架构风格...
REST (Representational State Transfer)是代表状态传输的缩写。它代表了分布式超媒体系统的体系结构风格,该风格是Roy Field在他的论文中定义的。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,...
REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,...