源代码下载地址: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的框架实现相关推荐

  1. Uber发布史上最简单的深度学习框架Ludwig!

    昨日,Uber官网重磅宣布新开源深度学习框架Ludwig,不需要懂编程知识,让专家能用的更顺手,让非专业人士也可以玩转人工智能,堪称史上最简单的深度学习框架! Ludwig是一个建立在TensorFl ...

  2. Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验

    Net Core平台灵活简单的日志记录框架NLog初体验 前几天分享的"[Net Core集成Exceptionless分布式日志功能以及全局异常过滤][https://www.cnblog ...

  3. Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验

    Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验 前几天分享的"[Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验][http://www ...

  4. 测试开发——搭建一个简单 web服务(flask框架基础)项目实战

    搭建一个简单 web服务-flask框架 一.什么是wsgi? 二.搭建一个简单 web服务 三.扩展 四.请求加参数的情况 五.安装flask 一.什么是wsgi? wsgi是webserver和a ...

  5. 重磅!Uber发布史上最简单的深度学习框架Ludwig!不懂编程也能玩转人工智能

    点击我爱计算机视觉标星,更快获取CVML新技术 昨日,Uber官网重磅宣布新开源深度学习框架Ludwig,不需要懂编程知识,让专家能用的更顺手,让非专业人士也可以玩转人工智能,堪称史上最简单的深度学习 ...

  6. 利用SpringCloud搭建一个最简单的微服务框架

    利用SpringCloud搭建一个最简单的微服务框架 https://blog.csdn.net/caicongyang/article/details/52974406 1.微服务 微服务主要包含服 ...

  7. Uber发布史上最简单的深度学习框架Ludwig!不懂编程也能玩转人工智能

    昨日,Uber官网重磅宣布新开源深度学习框架Ludwig,不需要懂编程知识,让专家能用的更顺手,让非专业人士也可以玩转人工智能,堪称史上最简单的深度学习框架! image Ludwig是一个建立在Te ...

  8. 使用 Python+Selenium + 第三方库实现的简单的 web 自动化测试框架 源码

    使用 Python+Selenium + 第三方库实现简单的 web 自动化测试框架,为 web 自动化测试编写更加便利和可维护. 一.配置(config) 1.1 说明 设置自动化案例运行时的属性值 ...

  9. 【自然语言处理】【多模态】OFA:通过简单的sequence-to-sequence学习框架统一架构、任务和模态

    OFA:通过简单的sequence-to-sequence学习框架统一架构.任务和模态 <Unifying Architectures, Task, and Modalities through ...

  10. Android简单学习使用PictureSelector框架图片选取裁剪

    Android简单学习使用PictureSelector框架图片选取裁剪 关于 效果图 第一步,添加引用 第二步,新建activity_main.xml布局文件 第三步,修改MainActivity. ...

最新文章

  1. CSS设置超出表格的内容用省略号显示
  2. DataGridView控件用法二:常用属性
  3. 面试准备-Shell脚本
  4. 《深入理解JVM.2nd》笔记(三):垃圾收集器与垃圾回收策略
  5. 2000年考研英语阅读理解文章四
  6. 萌新的Python练习实例100例(五)输入三个整数x,y,z,请把这三个数由小到大输出。
  7. c++ java string_C++中string类型的内部结构是什么?
  8. 入门学习asp.net mvc
  9. matplotlib制作多张图
  10. asp 保存listbox已有的值_使用Asp.net实现信息管理系统的数据统计功能
  11. 发现极为好用的数据库连接工具,基本上包含所有数据库DBeaver
  12. iOS媒体视频播放器应用源码
  13. 软考 java程序设计,软考程序员考点Java语言程序设计之数组
  14. 邻接矩阵的COO格式
  15. 设置虚拟机dns服务器域名,域名服务器DNS的设置实验
  16. 高分子专业计算机建模,高分子与计算机模拟.doc
  17. libnet、libnids、libpcap轻松搭建Linux网络入侵检测系统
  18. java license 验证方案_truelicense实现JAVA的license机制(包括license生成和验证)
  19. slam入门——十四讲笔记(一)
  20. Flowable No outgoing sequence flow of the exclusive gateway ‘xxx‘ could be selected for continuing

热门文章

  1. mac php7 mysql.so_mac下安装php7详解
  2. javadrawstring设置字符大小_LaTex学术写作——编辑文档格式 设置论文标题与摘要...
  3. 2020-12-09 深度学习 卷积神经网络中感受野的详细介绍
  4. mfc vs2013 项目怎么更改类名_VS2010 更改MFC标题及标题栏图标和exe图标
  5. oracle模块损坏,Oracle中模拟及修复数据块损坏
  6. abort has been called
  7. C++中的hash_map和map的区别
  8. 【数学与算法】凸函数、凸集、凸函数的一二阶数学解释
  9. Caffe学习系列(2):数据层及参数
  10. error MSB8008: 指定的平台工具集(v110)未安装或无效。请确保选择受支持的 PlatformToolset 值