转: Rest简介及Spring实现

一 Roy Fieldingweb

 

2000年Rest被Roy Fielding提出来的,我对Roy Fielding的印象有如下几个.app

一是RoyFielding作为Http协议的起草者,在Http协议发布没多久跳起来讲这个世界上不少人对于Http的使用是错误的,因此他说你们应该用Rest.less

二是没多久RoyFielding作为Rest思想的启蒙者,在Rest被人接受并被普遍使用没多久跳起来讲这个世界上不少人对Rest的使用是错误的..this

 

因此我在PPT上选了柏拉图的一句话作为副标题,"思想永远是宇宙的统治者".url

 

二 Restspa

 

Rest自己的内容比我想象的多的多,大体列出来几个关键点以下:设计

1.知足如下的Constraints:code

  

Constraints代码   收藏代码
  1. Client–server  
  2. Stateless  
  3. Cacheable  
  4. Layered system  
  5. Code on demand (optional)  
  6. Uniform interface  

 

 

 2.设计接口时候的原则component

 

    

Principles 代码   收藏代码
  1. Identification of resources  
  2. Manipulation of resources through these representations  
  3. Self-descriptive messages  
  4. Hypermedia as the engine of application state  

 

 

3.Rest但愿实现的目标orm

 

  

Key goals代码   收藏代码
  1. Scalability of component interactions  
  2. Generality of interfaces  
  3. Independent deployment of components  
  4. Intermediary components to reduce latency, enforce security and encapsulate legacy systems  

 

 

   以上内容都摘自Wiki,稍微整理了一下.感受以上的内容都很深入,因此我简单的列出来了我认为理解Rest的重要的地方.

 

 

  4.Rest对于咱们来讲

 

  

写道
Every Things is a Resource. 
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/list.do?query=g&count=10&searchFrom=product 

文艺风格 
/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拦截到仍是应该被直接访问的静态资源 

 

 

 第一个问题很简单.贴段代码以下:

  

Java代码   收藏代码
  1. @Controller  
  2. @RequestMapping(value = "/contact")  
  3. public class ContactController {  
  4.     private static final Log log = LogFactory.getLog(ContactController.class);  
  5.   
  6.   
  7.     @RequestMapping(value = "/{contact}", method = RequestMethod.GET)  
  8.     public String getContactdetail(@PathVariable Long contact, Model model) {  
  9.   
  10.         Contact c = this.contactService.getContact(contact);  
  11.         if (c == null) {  
  12.             c = new Contact();  
  13.         }  
  14.   
  15.         model.addAttribute("code", 0);  
  16.   
  17.         model.addAttribute("contact", c);  
  18.   
  19.         return "/contact/detail/jmodel";  
  20.     }  
  21. }  

 

 增删改查分别修改"method "以对应Http的四种方法(Post,Delete,Put,Get)就行了.

 变量直接经过@PathVariable 就能够拿到.

 

 

第二个问题我理解起来也很简单.用UrlRewriter将全部的请求分红两种.动态请求加一个前缀"/app/",配置Spring的拦截器只拦截这种请求. 静态资源之前缀"/r/"开始,请求路径不变.

 

这样任何一个请求都会乖乖的分红两部分,是以"/r/"开始的就不会走Spring,不是以"/r/"开头全转成"/app/",交给Spring处理.

 

主要配置以下

 

 

web.xml 写道
<filter-mapping> 
<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> 

 

urlrewrite.xml 写道
<urlrewrite default-match-type="wildcard"> 
<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文件.不记得在哪儿看到的了,先贴上来再说.

  

pom.xml 写道

<dependency> 
<groupId>org.tuckey</groupId> 
<artifactId>urlrewritefilter</artifactId> 
<version>3.1.0</version> 
</dependency>

 

 

 

 

 

Over,这个东西不是一个很详细的Spring配置说明.我记得第一次配的时候仍是出了很多问题的.不过我以为源码若是公开的话就什么问题都么有了~

等等看何时能够把Labs的源码公开了.

相关文章
相关标签/搜索