轉: 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的源碼公開了.

相關文章
相關標籤/搜索