转载自:Todd  Wei    http://www.cnblogs.com/weidagang2046/archive/2009/05/09/1453065.html

上一节我们通过两个例子初步体会了REST状态表述转移的味道,但应该指出这两个例子还仅仅是简单的资源获取。REST是以资源为核心的,没有服务的概念,这的确让人怀疑REST能否像ORB或SOA一样支持复杂的应用?在回答这个问题之前,让我们先暂时离开REST,把眼光转向基于关系数据库的3层构架。

通常业务逻辑层对外提供若干的功能接口(如图中定义的IOrderService),对内通过数据访问层访问数据库。我们知道,关系数据库只定义了CRUD(Create, Read, Update, Delete)四种标准的数据操作,分别对应于insert/select/update/delete四种sql语句。经验告诉我们,关系数据库在若干张表上进行关系运算是足以支持各种复杂业务逻辑的,因为所有业务功能最终都会被映射到数据库上的CRUD四种标准操作。下面这个有趣的三角形能帮助我们理解这个问题:

图中的三角分别代表:数据类型、操作、实例。可以把他们想象成可以调节的按钮,业务逻辑层的方式是:定义了少量的服务实例,把大量的操作放在服务实例下面,形象地比喻为“一扇小门,里面装了很多东西”;而数据库的方式则是提供了大量数据实例和CRUD四种标准操作,可比喻为“很多门,每扇门里面装少量的东西”。

以资源为核心的REST和以数据为核心的关系数据库是类似的。数据和资源本质上都是状态,对状态的操作CRUD少一个不行,多一个多余。因此,REST也采用CRUD四种标准操作,分别对应于HTTP协议的POST/GET/PUT/DELETE方法。虽然HTTP协议支持POST/GET/PUT/DELETE以外的HEAD等方法,可以把这些非标准方法作为有用的补充,但不应影响REST模型的纯洁性。上一节中,我们看到REST风格的应用像一个状态机;而这里我们则看到它像一个数据库。按REST方式定义出的资源(Url)和相应的操作就像下面这个样子(值得重申的是,从Url的含义“统一资源定位符”就可以看出其通用性,这也是REST资源表示的优势所在):

REST完美地结合了HTTP协议,所以更容易无缝接入互联网。另外,有人提到 “一个网站对外暴露的网页数可以作为衡量它为互联网所做贡献的指标”,如果从这个角度来看,以资源为核心的REST方式比服务为核心的SOA对互联网更加友好。但应该采用哪种风格的构架还是取决于应用本身的特点,一般来讲,对于以提供和管理数据为主的,且希望做SEO的应用适合REST风格,这包括大多数WEB2.0的应用;而以计算和业务逻辑为主,且强调安全性的应用不太适合REST风格。但应避免不加分析先入为主的采用面向服务的思维,有时候恰当运用状态表述转移模式的REST构架不但可以实现业务逻辑,而且具有更好的伸缩性,正如上一节谈到的心理测试服务和Google搜索一样。REST的价值就在于让我们在设计构架的时候多了一种视角,所谓“眼界决定世界”。

Cache

由于REST的Url表示资源和无状态服务特点,使得Cache机制变得异常简单,且HTTP协议中有直接支持。服务器响应可以通过cache-control:max-age,expires指定资源缓存时间;还可以在响应头的last-modified参数标明资源的最后修改时间,客户端请求可以带上if-modified-since参数,如果资源未过期,服务器只需用返回304 not modified状态即可,这样就避免了服务器端重复工作,也节省网络带宽;etag参数也是常用的cache控制参数,可以解决last-modified时间精度不够的问题。另外,HTTP协议还对Proxy机制有直接的支持,与Cache机制结合,在需要高性能的应用中,可以在服务器与客户端之间部署若干专门用于Cache目的Caching Proxy Server提高系统吞吐量。

总结

最后总结一下REST的要点:1. Url表示资源;2.  CRUD操作;3. 状态表述转移。至于无状态服务、Http状态码、Cache控制、Proxy等则属于上面几个要点的推论,理解REST的关键还在于理解以资源为核心的模型。本文是我接触REST不到一年时间的一些体会和总结,深知对REST的掌握和应用还需继续努力,希望得到高手的指点!

相关链接

1.《如何获取一杯咖啡——星巴克REST案例分析》

2.《深入浅出REST》

REST构架风格介绍之二:CRUD的更多相关文章

  1. REST构架风格介绍:状态表述转移

    REST(Representational State Transfer)是HTTP协议的作者Roy Fielding博士在其博士论文中提出的一种互联网应用构架风格.与以远程对象为核心的ORB和以服务 ...

  2. REST构架风格介绍之一:状态表述转移

    转载自:Todd Wei   http://www.cnblogs.com/weidagang2046/archive/2009/05/08/1452322.html REST(Representat ...

  3. REST构架风格介绍:状态表述转移(转)

    本文总结了一些REST风格构架设计的经验,介绍了REST架构的语言生态环境,状态表述转移,无状态服务器等特点,并通过举例Google来说明REST风格的味道. REST(Representationa ...

  4. 一个轻巧高效的多线程c++stream风格异步日志(二)

    目录 一个轻巧高效的多线程c++stream风格异步日志(二) 前言 LogFile类 AsyncLogging类 AsyncLogging实现 增加备用缓存 结语 一个轻巧高效的多线程c++stre ...

  5. 高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二)

    在项目开发中,尤其是企业的业务系统中,对文档的操作是非常多的,有时几乎给人一种错觉的是”这个系统似乎就是专门操作文档的“.毕竟现在的很多办公中大都是在PC端操作文档等软件,在这些庞大而繁重的业务中,单 ...

  6. cWeb开发框架,基于asp.net的cWeb应用开发平台介绍(二)

    cWeb是基于微软的.Net Framework 4框架,数据库是sql server 2008 r2. cWeb开发框架下载,点击这里去下载. cWeb开发框架借鉴三层架构理论分为三层,分别是:cD ...

  7. GCD介绍(二): 多核心的性能

    GCD介绍(二): 多核心的性能  概念         为了在单一进程中充分发挥多核的优势,我们有必要使用多线程技术(我们没必要去提多进程,这玩意儿和GCD没关系).在低层,GCD全局dispatc ...

  8. thinkPHP 模板中的语法知识 详细介绍(十二)

    原文:thinkPHP 模板中的语法知识 详细介绍(十二) 本章节:介绍模板中的语法,详细的语法介绍 一.导入CSS和JS文件    ==>记住常量的是大写 1.css link .js  sc ...

  9. 表现层及ASP.NET MVC介绍(二)

    表现层及ASP.NET MVC介绍(二) 最近的更新速度越来越慢,主要是项目上比较忙,封装EasyUi也要花很多时间.不过大家请放心,本系列不会半途夭折,并且代码干货也会持续更新.本文继续介绍表现层和 ...

随机推荐

  1. Ubuntu美化及配置,常见问题解决方案

    安装符合审美观,并且具有可用性的Ubuntu桌面,需要耗费一些时间与精力不过,相信我,这值得去做,你会享受这中间的过程,以及最后的成果 首先,我推荐安装的软件列表如下,在安装前,需要先执行以下的步骤: ...

  2. 初探Runloop(一)

    iOS 的最大特点就是运行时. 保证运行时的就是RunLoop 1.什么是RunLoop呢? 从字面理解就是:运行循环 引用下官方文档的介绍: A run loop is an event proce ...

  3. bzoj3111: [Zjoi2013]蚂蚁寻路

    题目链接 bzoj3111: [Zjoi2013]蚂蚁寻路 题解 发现走出来的图是一向上的凸起锯齿状 对于每个突出的矩形dp一下就好了 代码 /* */ #include<cstdio> ...

  4. Codeforces.1040E.Network Safety(思路 并查集)

    题目链接 \(Description\) 有一张\(n\)个点\(m\)条边的无向图,每个点有点权.图是安全的当且仅当所有边的两个端点权值不同.保证初始时图是安全的. 现在有权值为\(x\)的病毒,若 ...

  5. 【HDU5909】Tree Cutting(FWT)

    [HDU5909]Tree Cutting(FWT) 题面 vjudge 题目大意: 给你一棵\(n\)个节点的树,每个节点都有一个小于\(m\)的权值 定义一棵子树的权值为所有节点的异或和,问权值为 ...

  6. 垂直居中Demo

    换行文字垂直居中1 换行文字垂直居中,兼容所有浏览器 换行文字垂直居中2 换行文字垂直居中,兼容所有浏览器 固定宽高图片垂直居中1 固定宽高图片垂直居中2 图片自适应容器宽高垂直居中 CSS3垂直居中 ...

  7. Springboot_StringRedisTemplate配置

    @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { Str ...

  8. [原创]Linux下网络性能测试Netperf工具介绍及安装

    [原创]Linux下网络性能测试Netperf工具介绍及安装 1 官方网站 http://www.netperf.org/netperf/ 2 Netperf介绍 Netperf是一种网络性能的测试工 ...

  9. PHP之PDO_MYSQL扩展安装步骤(转)

    看到CakePHP文档要求安装pdo_mysql扩展,于是就尝试安装了一下. 这里我的系统是CentOS 6.0.如果你的系统是其他版本的Linux/Unix,可以参考.如果你的系统是Windows的 ...

  10. lua中的pairs和ipairs差别

    pairs Returns three values: the next function, the table t, and nil, so that the construction for k, ...