簡單的REST的架構實現

來源:互聯網
上載者:User

標籤:blog   http   java   os   strong   資料   

源碼:http://download.csdn.net/source/1662193 

 

  一. 認識REST

         REST軟體架構是由Roy Thomas Fielding博士在2000年首次提出的。他為我們描繪了開發基於互連網的網路軟體的藍圖。REST軟體架構是一個抽象的概念,是一種為了實現這一互連網的超媒體分布式系統的行動指南。利用任何的技術都可以實現這種理念。而實現這一軟體架構最著名的就是HTTP協議。通常我們把REST也寫作為REST/HTTP,在實際中往往把REST理解為基於HTTP的REST軟體架構,或者更進一步把REST和HTTP看作為等同的概念。

     更多請閱讀:

http://www.infoq.com/cn/articles/rest-architecure

http://www.kuqin.com/system-analysis/20080515/8518.html

   

       REST 的請求流程

       

 

 

個人總結:

  1. REST架構只是一種思想,並沒有限定任何技術,任何語言。
  2. REST的本質就是HTTP調用,用於降低各個應用之間的耦合度。
  3. 良好的REST 架構,應該有統一的表示方式和資料格式,能夠有效把各種資源群組織起來,並能夠進行有效控制。

 

二. 實現REST架構

 

 

 

1.架構設計

 

 

2.介面的定義

 

IRestRequest : 用來表示 REST請求

IRestResponse:用來表示 REST響應

IRestInterceptor:用來表示REST攔截器

                 RestException: 用來表示REST異常

 

 

 

3.實現的主要代碼

 

    初始化代碼,藉助Servlet的init

 

[javascript] view plaincopy
  1. @Override  
  2.     public void init(ServletConfig config) throws ServletException {  
  3.         //1.從init裡載入相應的Rest服務,如果是有Spring架構或者別的,原理都一樣  
  4.         String serviceClass = config.getInitParameter("service-class");  
  5.         if (serviceClass != null) {  
  6.             System.out.println("Rest服務:" + serviceClass);  
  7.             String[] classes = serviceClass.split(",");  
  8.             try {  
  9.                 for (String className : classes) {  
  10.                     Class newClass = Class.forName(className);  
  11.                     Object newObject = newClass.newInstance();  
  12.                     if (newObject instanceof IRestService) {  
  13.                         IRestService restService = (IRestService) newObject;  
  14.                         services.put(restService.getURI(), restService);  
  15.                         System.out.println("載入Rest服務:" + newObject.getClass().getName() + ",URI=" + restService.getURI());  
  16.                     }  
  17.                 }  
  18.             } catch (Exception e) {  
  19.                 System.out.println("載入Rest服務出錯:" + e.getMessage());  
  20.             }  
  21.         }  
  22.         //2.載入攔截器  
  23.         String interceptorClas = config.getInitParameter("interceptor-class");  
  24.         if (interceptorClas != null) {  
  25.             System.out.println("攔截器:" + serviceClass);  
  26.             String[] classes = interceptorClas.split(",");  
  27.             try {  
  28.                 for (String className : classes) {  
  29.                     Class newClass = Class.forName(className);  
  30.                     Object newObject = newClass.newInstance();  
  31.                     if (newObject instanceof IRestInterceptor) {  
  32.                         IRestInterceptor interceptor = (IRestInterceptor) newObject;  
  33.                         interceptors.add(interceptor);  
  34.                         System.out.println("載入Rest攔截器:" + newObject.getClass().getName());  
  35.                     }  
  36.                 }  
  37.             } catch (Exception e) {  
  38.                 System.out.println("載入Rest攔截器出錯:" + e.getMessage());  
  39.             }  
  40.         }  

    轉寄實現

[java] view plaincopy
  1. @Override  
  2.     protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  3.         //處理HTTP請求  
  4.         response.setContentType("text/html;charset=GBK");  
  5.         response.setCharacterEncoding("GBK");  
  6.         Response returnResponse = new Response(); //最終返回的結果,可以是JSON或者XML格式  
  7.         try {  
  8.             //1.獲得請求的URI  
  9.             String uri = request.getRequestURI();  
  10.             //System.out.println("URI===="+uri);  
  11.             //2.獲得相應的RestService  
  12.             IRestService service = services.get(uri);  
  13.             if (service != null) {  
  14.                 //2.0 校正service是否符合當前環境  
  15.              //--------------  
  16.                 //2.1 構造相應的 request 和 response 上下文  
  17.                 GenericRestRequest restRequest = new GenericRestRequest(request);  
  18.                 GenericRestResponse restResponse = new GenericRestResponse(response);  
  19.                 //2.2 填充環境變數之類  
  20.                 restRequest.setRestService(service);  
  21.                 restResponse.setRestService(service);  
  22.   
  23.                 //2.3 執行攔截器  
  24.                 for (IRestInterceptor interceptor : interceptors) {  
  25.                     interceptor.handleRest(restRequest, restResponse);  
  26.                 }  
  27.                 //2.4 執行服務  
  28.                 service.service(restRequest, restResponse);  
  29.                 //2.5  
  30.                 if (restResponse.getResponseData() != null) {  
  31.                     returnResponse = restResponse.getResponseData();  
  32.                 }  
  33.             } else {  
  34.                 throw new Exception("未找到對應的Rest服務:" + uri);  
  35.             }  
  36.         } catch (Exception e) {  
  37.             e.printStackTrace();  
  38.             returnResponse.addError("doAction", e.getMessage());  
  39.         }  
  40.         response.getWriter().write(returnResponse.toJSON());  
  41.     }  

 

 

    原型源碼下載:http://download.csdn.net/source/1662193

 

 

三. 資料格式

 

 先看看以前寫的一篇文章: http://blog.csdn.net/maoxiang/archive/2008/06/25/2584282.aspx  《改善Form提交資料的 UI 互動設計 》

 

  資料格式定義如下:

 

JSON 格式:

{

 code: 200|302|403|500 , 200表示正常,302表示跳轉,403表示需要驗證碼,500異常

 messages:{  //傳遞的資料

 [key:value]

}

XML格式:

<response>

  <code>200|302|403|500</code>

  <messages>

     <key></key>

     <value></value>

 </messages>

</response>

 

舉例說明:

{"code":200,"error":false,"messages":{"list":[{"name":"user0"},{"name":"user1"},{"name":"user2"},{"name":"user3"},{"name":"user4"}]},"ok":true,"redirect":false,"verify":false,"version":2}

 

採用javascript 來解析JSON格式就相對簡單很多了:

 

[javascript] view plaincopy
  1. if (data.code==200){ //如果是成功返回   
  2.   var users= data.messages.list; //這個由rest服務返回   
  3.   var html="以ol方式顯示資料:<br/><ol>”  
  4.  for(var i=0;i<users.length;i++){  
  5.      html+="<li>"+users[i].name+"</li>";  
  6.   }  
  7.   html+="</ol>";  
  8.   $("#idResult").html(html);   
  9. }else{   
  10. //出錯了,或者別的   
  11. alert(data.messages.doAction);   
  12. }  

 

 

四. 實際應用

1. 太平洋女性網搜店系統 http://shop.pclady.com.cn

2. 太平洋女性網曬客系統 http://blog.pclady.com.cn

3. 太平洋女性網化妝品庫 http://cosme.pclady.com.cn

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.