聂同学

一个程序员和架构师的实践与思考

关于REST风格的讨论(二)

参与到讨论中的架构师只有两三位。看来公司内对REST有看法的同学并不多。邮件如下。1

其中,XN是这次公司里负责研究和介绍REST的主要人员,通过讨论,我理解这次侧重于研究的是展示逻辑部署于浏览器端这种应用模式,以及如何以这种模式替换目前广泛使用的类似SpringMVC的服务器端展示逻辑。其中浏览器到服务器端的HTTP接口,用到了类似REST形式。对于REST本身的内涵和意义,这次并没有作为重点关注。

答复: 关于REST风格 - NLJ(我)

感谢大家参加讨论,对XN和CH的观点回复如下,供大家批评。

  • 缓存
    • 我理解缓存是REST最基本的优点之一。

    • “在WEB层框架上处理全局的数据缓存是不合适的”这个观点是同意的,没有异议,但我理解也不应该在框架层禁用缓存,比如XN在先前的邮件中提到的“所有REST请求与.do是一样的,都禁用浏览器缓存的,这个是由一个拦截器来完成的。”

    • “是否使用缓存”跟“XX框架是否有控制缓存实现”是两个层面的事情,我理解不能因为Spring3REST框架不支持控制缓存就禁用缓存。我们都知道缓存是由HTTP 头控制的,就算是最基本的直接写servlet也是可以操作HTTP头的。

    • 前面CH提到的缓存安全性跟cookie一样,这个有点问题。

      • 缓存不仅仅指浏览器上的缓存,还包括整个HTTP链路上的缓存,比如proxy上的,所以不像cookie只存在于某个人私人的机器上。

      • Cookie一般不会存放实际业务数据,比较多是些id、token之类的,即使泄露,风险也比较小。

  • 会话
    • 看来大家意见没有明显的差异。
  • 资源
    • 资源的划分,是个业务问题。而DTO,Form,表,Service这些都是实现问题。在划分资源时是不会看到实现上的任何概念的。如果划分的结果,一个资源的范围和Form(或者DTO,表)一样,那也仅仅是巧合而已。

    • 我理解划分资源通常是设计REST接口的时候,其依据是业务实体和业务过程对业务实体的使用,而不是某个系统某个功能对它的使用方式。因为一个资源不是为一个系统一个功能服务的,而是为一个业务一个企业服务的,它不知道使用它的会是谁,会是什么方式。

    • “各类终端(IOS/html/android)等的Form应该是统一的”这个不太理解,我理解即使在同一个平台上,不同的操作上下文中,也存在同一个业务对象映射到不同Form的情况。比如一个订单,有可能在一个页面上被扼要展示,在另一个页面上却详细展示,在可打印页面上又是另一种展示方式。Form的概念,完全是一个展示逻辑的概念,不是业务逻辑的概念。

  • HTTP远程调用
    • 既然作出了PF-REST,为什么不是推广REST?是因为REST不是我们的方向,还是感觉现阶段实现不了?

答复: 关于REST风格 - XN

  • 缓存

    我所理解的REST,它是与MVC一样,是一个基于HTTP协议的WEB层框架。在WEB层框架上处理全局的数据缓存是不合适的,比较多的是会话级别的(HTTPSession)。

    数据缓存本身涉及数据完整性,是要很小心地控制的。

    通过HTTP响应头控制浏览器的缓存,Spring3REST好像没有相应实现,还是我没有发现?其它的REST框架有实现?是否有例子?

  • 会话

    实际情况是,会话级别的缓存不可避免,大部分在应用需要登陆,至少uid需要缓存的。

  • 资源

    首先,资源抽象依据是什么?DTO?表? 如果是DTO或表,那要Services干什么?

    所以PF-REST提出以Form表单为抽象依据,各类终端(IOS/html/android)等的Form应该是统一的。

  • HTTP远程调用

    其实,PF推广的就是基于接口、REST风格的前后端分工开发模式,以区别MVC开发模式,不是推广REST本身,一切还是HTTP协议。

答复: 关于REST风格 - CH

没有去听这个分享,就我理解对于缓存部分有些看法:

  • 服务端缓存

    我同意NLJ的说法,没有一概而论不适合缓存的情况,能缓存的数据都是指允许在缓存更新周期内不一致的数据,

    数据自身属性决定是否适合缓存,和REST不REST有啥关系呢?

    具体做法上,直接利用Spring的基于方法参数的缓存和REST结合最合适,比如URL中有一部分代表方法,有一部分代表参数,在REST的实现方法中调用Service接口时传入这个参数,就可以把缓存做这个Service的接口方法上。

  • 客户端缓存

    REST接口一般返回JSON或者XML,这个json或者xml实际是可以当作普通图片这样的资源缓存在浏览器缓存中,只要服务端有控制Etag和失效日期,这样的话重复请求时服务端返回304,实际结果是直接来自于IE缓存的。

    至于安全性,我觉得这个和cookie在IE中存放是一个级别的,既然cookie都可以,那么这个缓存为啥不可以?


  1. 邮件按时间倒序,已经对人名和涉及到公司的专用名字做了更改。

rest, 架构

分享 -