简单的REST的框架实现
源代碼下載地址: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
?
@Override public void init(ServletConfig config) throws ServletException { //1.從init里載入對應的Rest服務,假設是有Spring框架或者別的,原理都一樣 String serviceClass = config.getInitParameter("service-class"); if (serviceClass != null) { System.out.println("Rest服務:" + serviceClass); String[] classes = serviceClass.split(","); try { for (String className : classes) { Class newClass = Class.forName(className); Object newObject = newClass.newInstance(); if (newObject instanceof IRestService) { IRestService restService = (IRestService) newObject; services.put(restService.getURI(), restService); System.out.println("載入Rest服務:" + newObject.getClass().getName() + ",URI=" + restService.getURI()); } } } catch (Exception e) { System.out.println("載入Rest服務出錯:" + e.getMessage()); } } //2.載入攔截器 String interceptorClas = config.getInitParameter("interceptor-class"); if (interceptorClas != null) { System.out.println("攔截器:" + serviceClass); String[] classes = interceptorClas.split(","); try { for (String className : classes) { Class newClass = Class.forName(className); Object newObject = newClass.newInstance(); if (newObject instanceof IRestInterceptor) { IRestInterceptor interceptor = (IRestInterceptor) newObject; interceptors.add(interceptor); System.out.println("載入Rest攔截器:" + newObject.getClass().getName()); } } } catch (Exception e) { System.out.println("載入Rest攔截器出錯:" + e.getMessage()); } }
??? 轉發實現
@Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //處理HTTP請求 response.setContentType("text/html;charset=GBK"); response.setCharacterEncoding("GBK"); Response returnResponse = new Response(); //終于返回的結果,能夠是JSON或者XML格式 try { //1.獲得請求的URI String uri = request.getRequestURI(); //System.out.println("URI===="+uri); //2.獲得對應的RestService IRestService service = services.get(uri); if (service != null) { //2.0 校驗service是否符合當前環境 //-------------- //2.1 構造對應的 request 和 response 上下文 GenericRestRequest restRequest = new GenericRestRequest(request); GenericRestResponse restResponse = new GenericRestResponse(response); //2.2 填充環境變量之類 restRequest.setRestService(service); restResponse.setRestService(service); //2.3 運行攔截器 for (IRestInterceptor interceptor : interceptors) { interceptor.handleRest(restRequest, restResponse); } //2.4 運行服務 service.service(restRequest, restResponse); //2.5 if (restResponse.getResponseData() != null) { returnResponse = restResponse.getResponseData(); } } else { throw new Exception("未找到相應的Rest服務:" + uri); } } catch (Exception e) { e.printStackTrace(); returnResponse.addError("doAction", e.getMessage()); } response.getWriter().write(returnResponse.toJSON()); }
?
?
??? 原型源代碼下載: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格式就相對簡單非常多了:
?
if (data.code==200){ //假設是成功返回 var users= data.messages.list; //這個由rest服務返回 var html="以ol方式顯示數據:<br/><ol>” for(var i=0;i<users.length;i++){ html+="<li>"+users[i].name+"</li>"; } html+="</ol>"; $("#idResult").html(html); }else{ //出錯了,或者別的 alert(data.messages.doAction); }
?
?
四. 實際應用
1. 太平洋女性網搜店系統 http://shop.pclady.com.cn
2. 太平洋女性網曬客系統 http://blog.pclady.com.cn
3. 太平洋女性網化妝品庫 http://cosme.pclady.com.cn
?.....
?
?
?
總結
以上是生活随笔為你收集整理的简单的REST的框架实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [原]零基础学习在Android进行SD
- 下一篇: cocos2d-x中几种存储数据的方式