简单的REST的框架实现
源代碼下載地址:http://download.csdn.net/source/1662193?
?
??一. 認識REST
???????? REST軟件架構(gòu)是由Roy Thomas Fielding博士在2000年首次提出的。他為我們描繪了開發(fā)基于互聯(lián)網(wǎng)的網(wǎng)絡(luò)軟件的藍圖。REST軟件架構(gòu)是一個抽象的概念,是一種為了實現(xiàn)這一互聯(lián)網(wǎng)的超媒體分布式系統(tǒng)的行動指南。利用不論什么的技術(shù)都能夠?qū)崿F(xiàn)這樣的理念。而實現(xiàn)這一軟件架構(gòu)最著名的就是HTTP協(xié)議。通常我們把REST也寫作為REST/HTTP,在實際中往往把REST理解為基于HTTP的REST軟件架構(gòu),或者更進一步把REST和HTTP看作為等同的概念。
???? 很多其它請閱讀:
http://www.infoq.com/cn/articles/rest-architecure
http://www.kuqin.com/system-analysis/20080515/8518.html
???
?????? REST 的請求流程示意圖
???????
?
個人總結(jié):
1.?????? REST架構(gòu)僅僅是一種思想,并沒有限定不論什么技術(shù),不論什么語言。
2.?????? REST的本質(zhì)就是HTTP調(diào)用,用于減少各個應(yīng)用之間的耦合度。
3.?????? 良好的REST 架構(gòu),應(yīng)該有統(tǒng)一的表示方式和數(shù)據(jù)格式,可以有效的把各種資源組織起來,并可以進行有效的控制。
?
二. 實現(xiàn)REST架構(gòu)
?
?
1.框架設(shè)計
?
2.接口的定義
?
IRestRequest : 用來表示 REST請求
IRestResponse:用來表示 REST響應(yīng)
IRestInterceptor:用來表示REST攔截器
???????????????? RestException: 用來表示REST異常
?
?
3.實現(xiàn)的主要代碼
?
??? 初始化代碼,借助Servlet的init
?
@Override public void init(ServletConfig config) throws ServletException { //1.從init里載入對應(yīng)的Rest服務(wù),假設(shè)是有Spring框架或者別的,原理都一樣 String serviceClass = config.getInitParameter("service-class"); if (serviceClass != null) { System.out.println("Rest服務(wù):" + 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服務(wù):" + newObject.getClass().getName() + ",URI=" + restService.getURI()); } } } catch (Exception e) { System.out.println("載入Rest服務(wù)出錯:" + 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()); } }
??? 轉(zhuǎn)發(fā)實現(xiàn)
@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(); //終于返回的結(jié)果,能夠是JSON或者XML格式 try { //1.獲得請求的URI String uri = request.getRequestURI(); //System.out.println("URI===="+uri); //2.獲得對應(yīng)的RestService IRestService service = services.get(uri); if (service != null) { //2.0 校驗service是否符合當(dāng)前環(huán)境 //-------------- //2.1 構(gòu)造對應(yīng)的 request 和 response 上下文 GenericRestRequest restRequest = new GenericRestRequest(request); GenericRestResponse restResponse = new GenericRestResponse(response); //2.2 填充環(huán)境變量之類 restRequest.setRestService(service); restResponse.setRestService(service); //2.3 運行攔截器 for (IRestInterceptor interceptor : interceptors) { interceptor.handleRest(restRequest, restResponse); } //2.4 運行服務(wù) service.service(restRequest, restResponse); //2.5 if (restResponse.getResponseData() != null) { returnResponse = restResponse.getResponseData(); } } else { throw new Exception("未找到相應(yīng)的Rest服務(wù):" + uri); } } catch (Exception e) { e.printStackTrace(); returnResponse.addError("doAction", e.getMessage()); } response.getWriter().write(returnResponse.toJSON()); }
?
?
??? 原型源代碼下載:http://download.csdn.net/source/1662193
?
?
三. 數(shù)據(jù)格式
?
?先看看曾經(jīng)寫的一篇文章: http://blog.csdn.net/maoxiang/archive/2008/06/25/2584282.aspx? 《改善Form提交數(shù)據(jù)的 UI 交互設(shè)計?》
?
? 數(shù)據(jù)格式定義例如以下:
?
JSON 格式:
{
?code: 200|302|403|500 , 200表示正常,302表示跳轉(zhuǎn),403表示須要驗證碼,500異常
?messages:{? //傳遞的數(shù)據(jù)
?[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){ //假設(shè)是成功返回 var users= data.messages.list; //這個由rest服務(wù)返回 var html="以ol方式顯示數(shù)據(jù):<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); }
?
?
四. 實際應(yīng)用
1. 太平洋女性網(wǎng)搜店系統(tǒng) http://shop.pclady.com.cn
2. 太平洋女性網(wǎng)曬客系統(tǒng) http://blog.pclady.com.cn
3. 太平洋女性網(wǎng)化妝品庫 http://cosme.pclady.com.cn
?.....
?
?
?
總結(jié)
以上是生活随笔為你收集整理的简单的REST的框架实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [原]零基础学习在Android进行SD
- 下一篇: Java Date 日期 时间 相关方法