转: Rest简介及Spring实现
2000年Rest被Roy Fielding提出来的,我对Roy Fielding的印象有以下几个.
一是RoyFielding做为Http协议的起草者,在Http协议发布没多久跳起来说这个世界上很多人对于Http的使用是错误的,所以他说大家应该用Rest.
二是没多久RoyFielding做为Rest思想的启蒙者,在Rest被人接受并被广泛使用没多久跳起来说这个世界上很多人对Rest的使用是错误的..
所以我在PPT上选了柏拉图的一句话做为副标题,"思想永远是宇宙的统治者".
二 Rest
Rest本身的内容比我想象的多的多,大致列出来几个关键点如下:
1.满足以下的Constraints:
- Client–server
- Stateless
- Cacheable
- Layered system
- Code on demand (optional)
- Uniform interface
2.设计接口时候的原则
- Identification of resources
- Manipulation of resources through these representations
- Self-descriptive messages
- Hypermedia as the engine of application state
3.Rest希望实现的目标
- Scalability of component interactions
- Generality of interfaces
- Independent deployment of components
- Intermediary components to reduce latency, enforce security and encapsulate legacy systems
以上内容都摘自Wiki,稍微整理了一下.感觉以上的内容都很深刻,所以我简单的列出来了我认为理解Rest的重要的地方.
4.Rest对于我们来说
Every Resouce has a ID.
We Can Use Http Meothod(Get/Post/Put/Delete) Handle Resource.
简单说,再设计接口的时候,
第一个想到的是,我要提供的资源是什么.
第二个想到的是,这个资源的展现形式是什么.
第三个想到的是,这个资源上封装的操作是什么
我觉得这些就足够了.Rest和Soap比有太多的好处了,还有利于SEO(感谢搜索组的两位大神说到两点,一个是Url Path本身占的权重比Parameters高,一个是Url链接本身的权重就比较高.)
如果是设计一个键盘精灵的接口的话(之前博客中提到过键盘精灵,这里的主要的功能是查找拼音中以"Q"开头的产品列表),仿照前段时间四处流行的对比手法写出来三种不同风格的Url接口设计
文艺风格
/prompt/product/g/10
2B风格 /?method=getProductPromt&query=g&count=10&searchFrom=product
这时候已经有很多人在争论Rest有没有用处,还有不少人在讨论Rest的适用场景了,还有人问到比较实际的问题,比如说多参数怎么解决.
我觉得Rest本身提供的是一种方式,怎么样让这种方式变得更艺术还真的取决于你怎么去使用他.设计Rest的接口更是一种艺术形式,最简单的例子,我要看一个人的某个时间段发表的文章列表,可能会有以下几种设计方式:
1. /person/xdyl/20000101-20000202
2. /person/xdyl/start/20000101/end/20000202
3./person/xdyl?start=20000101&end/20000202
4./person/xdyl/20000101/20000202/
哪种方式好就看个人喜好了吧.搜了一下SpringMVC也没看到有这种解决方案,之前还以为会有/{a}-{b}/这样的方式.
如果其他的朋友有好的解决方案还请多指点.
三 Spring MVC实现.
我觉得Spring MVC的实现很简单.大概牵涉到两个地方.
1.Spring 本身怎么支持从Path中获取变量的.
2.系统怎么区分一个请求应该被Spring拦截到还是应该被直接访问的静态资源
第一个问题很简单.贴段代码如下:
- @Controller
- @RequestMapping(value = "/contact")
- public class ContactController {
- private static final Log log = LogFactory.getLog(ContactController.class);
- @RequestMapping(value = "/{contact}", method = RequestMethod.GET)
- public String getContactdetail(@PathVariable Long contact, Model model) {
- Contact c = this.contactService.getContact(contact);
- if (c == null) {
- c = new Contact();
- }
- model.addAttribute("code", 0);
- model.addAttribute("contact", c);
- return "/contact/detail/jmodel";
- }
- }
增删改查分别修改"method "以对应Http的四种方法(Post,Delete,Put,Get)就好了.
变量直接通过@PathVariable 就可以拿到.
第二个问题我理解起来也很简单.用UrlRewriter将所有的请求分成两种.动态请求加一个前缀"/app/",配置Spring的拦截器只拦截这种请求. 静态资源以前缀"/r/"开始,请求路径不变.
这样任何一个请求都会乖乖的分成两部分,是以"/r/"开始的就不会走Spring,不是以"/r/"开头全转成"/app/",交给Spring处理.
主要配置如下
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--Spring只拦截/app/的请求-->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
<rule>
<from>/r/**</from>
<to>/r/$1</to>
</rule>
<rule>
<from>/**</from>
<to>/app/$1</to>
</rule>
<outbound-rule>
<from>/app/**</from>
<to>/$1</to>
</outbound-rule>
</urlrewrite>
UrlRewrite可以用其它有同样功能的任意代替,Apache神马的最讨厌了.
最后附上我用到的UrlRewriter的Pom文件.不记得在哪儿看到的了,先贴上来再说.
<groupId>org.tuckey</groupId>
<artifactId>urlrewritefilter</artifactId>
<version>3.1.0</version>
</dependency>
Over,这个东西不是一个很详细的Spring配置说明.我记得第一次配的时候还是出了不少问题的.不过我觉得源码如果公开的话就什么问题都么有了~
等等看什么时候可以把Labs的源码公开了.
转: Rest简介及Spring实现的更多相关文章
- Unit01: Spring简介 、 Spring容器 、 Spring IOC
Unit01: Spring简介 . Spring容器 . Spring IOC Spring (1)Spring是什么? Spring是一个开源的用来简化应用开发的框架. (2)Spring的特点? ...
- 图书简介:Spring Batch批处理框架
大数据时代批处理利器,国内首度原创解析Spring Batch框架. 内容简介: <Spring Batch 批处理框架>全面.系统地介绍了批处理框架Spring Batch,通过详尽的实 ...
- Spring简介即Spring Ioc
Spring框架简介 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE De ...
- spring复习 -day1:Spring简介 、 Spring容器 、 Spring IOC
Spring创建对象方法 创建对象过程: 第一步:添加SpringIOC环境 (1)在WebRoot/WEB-INT/lib文件夹下,引入SpringIOC配置环境的jar包 如图: (2)在sr ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:4.技术简介之Spring
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 Spring是一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One ...
- 阶段3 2.Spring_01.Spring框架简介_06.spring的体系结构
资料内提供了spring 的开发包 docs:文档 libs:jar包 schema:约束
- 阶段3 2.Spring_01.Spring框架简介_01.spring课程四天安排
spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...
- 阶段3 2.Spring_01.Spring框架简介_05.spring的优势
- 阶段3 2.Spring_01.Spring框架简介_04.spring发展历程
随机推荐
- Python3基础 列表乘一个整数 扩增列表
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- 类型转换bin()、chr()、ord() 、int()、float()、str()、repr()、bytes()、tuple(s )、 list(s ) 、unichr(x ) 、 ord(x ) 、 hex(x ) 、 type()数据类型查询
1.bin() 将整数x转换为二进制字符串,如果x不为Python中int类型,x必须包含方法__index__()并且返回值为integer: 参数x:整数或者包含__index__()方法切返回值 ...
- 腾讯QQ你的缓存策略应该改下了
缓存策略基本原则大家都怎么考虑的? 缓存好友数量这个也是醉了,这个数字好像变化频率有点低吧,ok,就算你企鹅用户量大,需要缓存,那肉肉的问一句你这更新策略也不能只管网上涨的,不管往下降的吧?难不成你是 ...
- 创建EF数据模型
最后的应用程序,看上去就像下边这样: 创建数据模型,你将从以下三个类开始: 在Models文件夹,新建以下类: using System; using System.Collections.Gener ...
- Mac系统下显示和隐藏文件
在配置Maven的时候需要更改.m2文件,所以要将.m2显示出来,记录一下方便日后使用. 显示文件:在终端输入defaults write com.apple.finder AppleShowAllF ...
- 浅谈一下关于使用css3来制作圆环进度条
最近PC端项目要做一个这样的页面出来,其他的都很简单,关键在于百分比的圆环效果.我最初打算是直接使用canvas来实现的,因为canvas实现一个圆是很简便的. 下面贴出canvas实现圆环的代码,有 ...
- 概率dp专场
专题链接 第一题--poj3744 Scout YYF I 链接 (简单题) 算是递推题 如果直接推的话 会TLE 会发现 在两个长距离陷阱中间 很长一部分都是重复的 我用 a表示到达i-2步的概率 ...
- Android之Dialer之紧急号码
Android之Dialer之紧急号码 e over any other (e.g. supplementary service related) number analysis. a) 112 an ...
- C#中使用Linq实现全外连接
每次使用都到处查阅,现在记录下来,备查. var fulljoin = (from s in sampleRegistersjoin t in tensionDatas on new { Beach ...
- javascript原型prototype浅识
C++,java是基于类的语言,主要通过类来实现继承. javascript是基于原型的语言,通过原型来实现继承. 什么是原型?每种物质,都可以追根溯源,原型就是对象的根源.继承就是追根溯源. jav ...