简单的REST的框架实现

一. 认识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的框架实现

个人总结:

1.REST架构只是一种思想,并没有限定任何技术,任何语言。

2.REST的本质就是HTTP调用,用于降低各个应用之间的耦合度。

3.良好的REST架构,应该有统一的表示方式和数据格式,能够有效的把各种资源组织起来,并能够进行有效的控制。

二.实现REST架构

1.框架设计

简单的REST的框架实现

2.接口的定义

IRestRequest :用来表示REST请求

IRestResponse:用来表示REST响应

IRestInterceptor:用来表示REST拦截器

RestException:用来表示REST异常

3.实现的主要代码

初始化代码,借助Servlet的init

[javascript]view plaincopy
  1. @Override
  2. publicvoidinit(ServletConfigconfig)throwsServletException{
  3. //1.从init里加载相应的Rest服务,如果是有Spring框架或者别的,原理都一样
  4. StringserviceClass=config.getInitParameter("service-class");
  5. if(serviceClass!=null){
  6. System.out.println("Rest服务:"+serviceClass);
  7. String[]classes=serviceClass.split(",");
  8. try{
  9. for(StringclassName:classes){
  10. ClassnewClass=Class.forName(className);
  11. ObjectnewObject=newClass.newInstance();
  12. if(newObjectinstanceofIRestService){
  13. IRestServicerestService=(IRestService)newObject;
  14. services.put(restService.getURI(),restService);
  15. System.out.println("加载Rest服务:"+newObject.getClass().getName()+",URI="+restService.getURI());
  16. }
  17. }
  18. }catch(Exceptione){
  19. System.out.println("加载Rest服务出错:"+e.getMessage());
  20. }
  21. }
  22. //2.加载拦截器
  23. StringinterceptorClas=config.getInitParameter("interceptor-class");
  24. if(interceptorClas!=null){
  25. System.out.println("拦截器:"+serviceClass);
  26. String[]classes=interceptorClas.split(",");
  27. try{
  28. for(StringclassName:classes){
  29. ClassnewClass=Class.forName(className);
  30. ObjectnewObject=newClass.newInstance();
  31. if(newObjectinstanceofIRestInterceptor){
  32. IRestInterceptorinterceptor=(IRestInterceptor)newObject;
  33. interceptors.add(interceptor);
  34. System.out.println("加载Rest拦截器:"+newObject.getClass().getName());
  35. }
  36. }
  37. }catch(Exceptione){
  38. System.out.println("加载Rest拦截器出错:"+e.getMessage());
  39. }
  40. }

转发实现

  1. @Override
  2. protectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
  3. //处理HTTP请求
  4. response.setContentType("text/html;charset=GBK");
  5. response.setCharacterEncoding("GBK");
  6. ResponsereturnResponse=newResponse();//最终返回的结果,可以是JSON或者XML格式
  7. try{
  8. //1.获得请求的URI
  9. Stringuri=request.getRequestURI();
  10. //System.out.println("URI===="+uri);
  11. //2.获得相应的RestService
  12. IRestServiceservice=services.get(uri);
  13. if(service!=null){
  14. //2.0校验service是否符合当前环境
  15. //--------------
  16. //2.1构造相应的request和response上下文
  17. GenericRestRequestrestRequest=newGenericRestRequest(request);
  18. GenericRestResponserestResponse=newGenericRestResponse(response);
  19. //2.2填充环境变量之类
  20. restRequest.setRestService(service);
  21. restResponse.setRestService(service);
  22. //2.3执行拦截器
  23. for(IRestInterceptorinterceptor:interceptors){
  24. interceptor.handleRest(restRequest,restResponse);
  25. }
  26. //2.4执行服务
  27. service.service(restRequest,restResponse);
  28. //2.5
  29. if(restResponse.getResponseData()!=null){
  30. returnResponse=restResponse.getResponseData();
  31. }
  32. }else{
  33. thrownewException("未找到对应的Rest服务:"+uri);
  34. }
  35. }catch(Exceptione){
  36. e.printStackTrace();
  37. returnResponse.addError("doAction",e.getMessage());
  38. }
  39. response.getWriter().write(returnResponse.toJSON());
  40. }

原型源码下载:http://download.****.net/source/1662193

三. 数据格式

先看看以前写的一篇文章:http://blog.****.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. varusers=data.messages.list;//这个由rest服务返回
  3. varhtml="以ol方式显示数据:<br/><ol>”
  4. for(vari=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

.....

原文:http://blog.****.net/maoxiang/article/details/4551434#comments