標籤: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 的請求流程
個人總結:
- REST架構只是一種思想,並沒有限定任何技術,任何語言。
- REST的本質就是HTTP調用,用於降低各個應用之間的耦合度。
- 良好的REST 架構,應該有統一的表示方式和資料格式,能夠有效把各種資源群組織起來,並能夠進行有效控制。
二. 實現REST架構
1.架構設計
2.介面的定義
IRestRequest : 用來表示 REST請求
IRestResponse:用來表示 REST響應
IRestInterceptor:用來表示REST攔截器
RestException: 用來表示REST異常
3.實現的主要代碼
初始化代碼,藉助Servlet的init
[javascript] view plaincopy
- @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());
- }
- }
轉寄實現
[java] view plaincopy
- @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格式就相對簡單很多了:
[javascript] view plaincopy
- 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