• 简单的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

    [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.         }  

        转发实现

    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

  • 相关阅读:
    Python的分子模拟动态促进DF Theory理论对二进制硬盘系统的适用性
    【视频】极值理论EVT与R语言应用:GPD模型火灾损失分布分析
    【视频】人工智能AI、大数据与消费者洞察报告PPT
    数据分享|Python卷积神经网络CNN身份识别图像处理在疫情防控下口罩识别、人脸识别
    R语言对airbnb数据nlp文本挖掘、地理、词云可视化、回归GAM模型、交叉验证分析
    Eviews用向量自回归模型VAR实证分析公路交通通车里程与经济发展GDP协整关系时间序列数据和脉冲响应可视化
    基于简化的评分卡、Smote采样和随机森林的信贷违约预测
    【走进RDS】之SQL Server性能诊断案例分析
    阿里本地生活全域日志平台 Xlog 的思考与实践
    阿里云 EMAS Serverless 重磅发布
  • 原文地址:https://www.cnblogs.com/pricks/p/3858710.html
Copyright © 2020-2023  润新知