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

@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的框架实现

时间: 2024-10-16 01:48:35

简单的REST的框架实现的相关文章

Socket在iOS客户端上的简单实现 - 利用GCAsyncSocket框架

GCAsyncSocket 这是一个2003的开发出来的一个开源框架 首先把GCDAsyncSocket的.h和.m文件拖入到工程中 试图控制器遵守GCDAsyncSocketDelegate协议 实例:在页面上有一个简单的textView和textField 在textField中输入文字后,点击发送即可把文字发送到服务器 ,服务器端返回的文字数据会显示到textView上 //  服务器主机ip地址#define kHost @"172.16.3.101"//  服务器主机通信端口

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

目录 [SSH进阶之路]一步步重构容器实现Spring框架--从一个简单的容器开始(八) [SSH进阶之路]一步步重构容器实现Spring框架--解决容器对组件的"侵入式"管理的两种方案--主动查找和控制反转(九) [SSH进阶之路]一步步重构容器实现Spring框架--配置文件+反射实现IoC容器(十) [SSH进阶之路]一步步重构容器实现Spring框架--彻底封装,实现简单灵活的Spring框架(十一) 博文[SSH进阶之路]一步步重构容器实现Spring框架--从一个简单的容器

一个超级简单的HTML模板框架源代码以及使用示例

HTML模板框架源代码 var HtmlTemplate = (function () { function HtmlTemplate(htmlSource) { this.htmlSource = htmlSource; } HtmlTemplate.prototype.toHTML = function (params) { var reg = HtmlTemplate.REG_FILTER_PARAM; var m = this.htmlSource.replace(reg, functi

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

xtyle框架充分利用语义化标签来做美化样式,兼容多款主流浏览器,包括IE8. xtyle框架虽然没BS这么强大,但我觉得也很实用,体积不算很大,适用于企业网站.WordPress主题.个人网站.博客等方面的应用,当然手机端也是适用哦! 框架下载地址:xtyle 栅格系统(Layout) 栅格系统我想很多人是比较关注的,这个xtyle的栅格系统很简单,也很实用和易用,栅格Class由.gird1-.grid10来控制. 布局简单用法 一栏布局 直接使用class="gird1"即可.

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

Net Core平台灵活简单的日志记录框架NLog初体验 前几天分享的"[Net Core集成Exceptionless分布式日志功能以及全局异常过滤][https://www.cnblogs.com/yilezhu/p/9339017.html]" 有人说比较重量,生产环境部署也比较麻烦.因此就有了今天的这篇文章.如果你的项目(网站或者中小型项目)不是很大,日志量也不多的话可以考虑NLog+Mysql的组合.因为NLog具有高性能,易于使用,易于扩展和灵活配置的特点能够让你快速集成日

springmvc的简单使用以及ssm框架的整合

Spring web mvc是基于servlet的一个表现层框架 首先创建一个简单的web工程了解它的使用 web.xml的配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee&quo

一个简单的通讯服务框架(大家发表意见一起研究)JAVA版本

最近研究下java语言,根据一般使用的情况,写了个连接通讯服务的框架: 框架结构 C-Manager-S; 把所有通讯内容抽取成三个方法接口:GetData,SetData,带返还的Get; 所有数据都处理为byte[];客户端与服务端和管理器以及服务端有多重处理模式 管理信息: 1.不需要中心管理器:服务端启动时向客户端广播自己绑定的地址:接收数据:客户端使用时广播一次请求,向所有服务端获取服务信息: 2.管理中心:客户端向管理器请求服务信息:服务端向管理器注册地址:根据需要,可以把客户端传递

简单的c#插件框架

插件式架构,一种全新的.开放性的.高扩展性的架构体系.插件式架构设计近年来非常流行,基于插件的设计好处很多,把扩展功能从框架中剥离出来,降低了框架的复杂度,让框架更容易实现.扩展功能与框架以一种很松的方式耦合,两者在保持接口不变的情况下,可以独立变化和发布.基于插件设计并不神秘,相反它比起一团泥的设计更简单,更容易理解.下面已C# .Net简要介绍一下插件式架构的方法. 定义插件接口,将其编译成dll namespace PluginInterface { public interface IP

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

为什么你想要自己构建一个 web 框架呢?我想,原因有以下几点: 你有一个新奇的想法,觉得将会取代其他的框架 你想要获得一些名气 你遇到的问题很独特,以至于现有的框架不太合适 你对 web 框架是如何工作的很感兴趣,因为你想要成为一位更好的 web 开发者. 接下来的笔墨将着重于最后一点.这篇文章旨在通过对设计和实现过程一步一步的阐述告诉读者,我在完成一个小型的服务器和框架之后学到了什么.你可以在这个代码仓库中找到这个项目的完整代码. 我希望这篇文章可以鼓励更多的人来尝试,因为这确实很有趣.它让