源代码下载地址: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. 动端逐渐出了许多的移动端的框架,比如Sencha Touch、JQTouch、Jquery-moblie、jqMobi等等。这些框架都有优缺点,不同的框架应用在不同的项目中。现简单阐述一下各框架的优缺点:

    移动前端工作的那些事---前端制作之微信小技巧篇   (2013-11-15 15:20) 转载▼ 标签: it css3/javascript html5 webapp 手机网站搭建 分类: 前端制 ...

  2. Node.js简单介绍并实现一个简单的Web MVC框架

    编号:1018时间:2016年6月13日16:06:41功能:Node.js简单介绍并实现一个简单的Web MVC框架URL :https://cnodejs.org/topic/4f16442cca ...

  3. 模糊系统架构和简单实现--AForge.NET框架的使用(四)

    原文:模糊系统架构和简单实现--AForge.NET框架的使用(四) 先说一下,为什么题目是简单实现,因为我实在没有弄出好的例子. 我原来用AForge.net做的项目中的模糊系统融入了神经网络和向量 ...

  4. 充分利用HTML标签元素 – 简单的xtyle前端框架

    xtyle框架充分利用语义化标签来做美化样式,兼容多款主流浏览器,包括IE8. xtyle框架虽然没BS这么强大,但我觉得也很实用,体积不算很大,适用于企业网站.WordPress主题.个人网站.博客 ...

  5. 【SSH进阶之路】一步步重构容器实现Spring框架——彻底封装,实现简单灵活的Spring框架(十一)

    文件夹      [SSH进阶之路]一步步重构容器实现Spring框架--从一个简单的容器開始(八)      [SSH进阶之路]一步步重构容器实现Spring框架--解决容器对组件的"侵入 ...

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

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

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

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

  8. Python+selenium之简单介绍unittest单元测试框架

    Python+selenium之简单介绍unittest单元测试框架 一.unittest简单介绍 unittest支持测试自动化,共享测试用例中的初始化和关闭退出代码,在unittest中最小单元是 ...

  9. entitybuilder--一个简单的业务通用框架

    关于业务通用框架的思考 业务系统是千差万别的,例如,保存.更新和删除订单,或者保存订单和保存客户,走的根本不是一个流程.但是,它们还是有共同点,它们的流程大致可以分成下面的几个部分: 拿到增删改等操作 ...

  10. 从零构建一个简单的 Python Web框架

    为什么你想要自己构建一个 web 框架呢?我想,原因有以下几点: 你有一个新奇的想法,觉得将会取代其他的框架 你想要获得一些名气 你遇到的问题很独特,以至于现有的框架不太合适 你对 web 框架是如何 ...

随机推荐

  1. Hive学习之更改表的属性

    1.修改表名    alter table table_name rename to new_table_name;2.修改列名    alter table tablename change col ...

  2. PHPEXCEL导入小技巧

    在导入excel的时候,单元格格式和公式经常让导入不顺畅.注意phpexcel文档说明,基本上就可以很顺利的导入. 1.忽略单元格格格式,并导入xls.xlsx两种格式 $objReader = PH ...

  3. MySql按指定天数进行分组数据统计分析 2

    上次的随笔1中写的分组方式,经分析,是从前往后进行分组,即若选择2014的数据进行统计每11天为一组的话,1的分组方式, 按照2014-01-01——2014-01-11为一组,之后每11天为一组. ...

  4. windows server system32下常见快捷指令

    win+R       命令行窗口 cmd        dos命令窗口 mstsc      远程登录输入窗口 calc         快速打卡计算器 control     打开控制面板 eve ...

  5. tomcat部署不正确

    我把一个名为cp的web项目导入myeclipse中,由于要再次导入该工程的新版本,我就把旧版本的cp项目改名成cp3.但是在运行新项目cp的时候,tomcat出问题,一直是之前旧cp对应的tomca ...

  6. 安装CAD出现Error 1904.Module的解决方法

    在安装AutoCAD2008时,安装过程中出现了一个小错误,虽然说不影响使用,也不影响功能,但还是需要把这个问题解决,今天就和大家分享解决这个问题的方法. 错误描述 会在安装过程中出现错误提示:Err ...

  7. 苹果iPhone不能判断红外发射管的好坏

    用手机来检测红外发射管好坏是目前比较常用的方法.实际操作比较简单,就是按照红外发射管的工作电压给发射管接上电源后,把手机的摄像头对着红外发射管就能看出好坏了.由于红外线是肉眼看不见的,如果不通过手机摄 ...

  8. Toolkit 一键激活Office 2010方法及Office 2010 Toolkit工具下载

    Office 2010激活的方法很多,但推荐使用本站亲测,可永久使用的两种方法,随便使用哪一种,一个不行就换另外一个.基本上只要Office 2010正常安装了,下面两种方法的任何一种都可以正常激活. ...

  9. Codeforces Round#344

    A题意思是,给出两个数列,求一个区间,使第一个数列的区间或和第二个数列的区间或的和最大,输出最大和 很显然,或运算会使得答案越运算越大.所以,直接全部或起来,相加就是答案. = =打cf的时候自动脑补 ...

  10. 第七届河南省赛A.物资调度(dfs)

    10401: A.物资调度 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 95  Solved: 54 [Submit][Status][Web Bo ...