zz: Shindig Rest处理过程

原文链接:http://blog.csdn.net/hissippi/article/details/5651729

Shindig学习笔记-REST方式的请求处理过程

OpenSocial REST request processing in Shindig.

 

在Shindig项目中,典型的rest方式的请求一般是这样的(省略主机地址):

/social/rest/people/{guid}/@all/{pid}
/social/rest/activities/{guid}/@self/{activityid}
/social/rest/appdata/{guid}/@self/{appid}
/social/rest/groups/{guid}

 


然后在项目的Web工程的配置文件web.xml可以看到,所有rest方式的请求都会被映射到DataServiceServlet上。

 

  1. ……   
  2. <servlet>  
  3.     <servlet-name>socialRestapiServlet</servlet-name>  
  4.     <servlet-class>  
  5.       org.apache.shindig.protocol.DataServiceServlet  
  6.     </servlet-class>  
  7.     <init-param>  
  8.       <param-name>handlers</param-name>  
  9.       <param-value>org.apache.shindig.social.handlers</param-value>  
  10.     </init-param>  
  11.   </servlet>  
  12. ……  
  13.   <servlet-mapping>  
  14.     <servlet-name>socialRestapiServlet</servlet-name>  
  15.     <url-pattern>/social/rest/*</url-pattern>  
  16.   </servlet-mapping>  
  17. ……  
 

 

Figure 1-Servlet configuration for REST request(web.xml)

 

So all the request are pass to DataServiceServlet. When the first request comes to the server after it started.

 

 


 

Figure 2- Details of the process

 

当服务器启动后,第一个对social modulesrest 请求到来,会进行DataServiceServlet的初始化工作。这个过程是在所继承的上一级类ApiServlet中的init()方法完成。

 

初始化:

ApiServlet:

servlet初始化:

1. 获取系统中的handlers的配置位置。In web.xml, socialRestapiServlet 的配置有一个初始参数:org.apache.shindig.social.handlers。这个配置只是一个名称,作为一个Annotation,用来设置Guice中的Key。这样可以将系统中的handlers进行分组,在实际server实现中采用不同的handlers实现。

对实例的绑定是在SocialApiGuiceModule中配置的.

SocialApiGuiceModule继承google Guice中的AbstractModule类,覆写了configure方法,进行相关handers的注入绑定(还有诸如对ParameterFetcherXStreamConfigurationBeanConverter其他类的绑定)

·       ActivityHandler

·       AppDataHandler

·       PersonHandler

·       MessageHandler

这里可以在getHandlers()方法中配置目前系统所有已经实现的XXXHandler类。


2. 然后利用HandlerRegistry中的addHandlers()方法,注入添加所需要的处理Handlers

 

DefaultHandlerRegistry

这里主要进行的就是对各个模块实际的处理handler的注册和匹配工作,在初始化中最重要最主要的工作都是在这里面完成。


public void addHandlers(Set<Object> handlers)

前面已经提到过将handles的实例绑定到injector中。在这个函数中会根据请求的路径获取实际用来处理的具体handle。这里会调用creatRestHandle()函数,将实际的handlers中和Methods方法做一个映射的Map。最终结果就是在一个HandlerRegistry类型dispatcher对象中储存所有的Handlers 路径和Http method的映射。


private void createRestHandler(Provider<?> handlerProvider,

                                          Service service, Operation op, Method m)

这个函数会通过serviceoperationhttp method方法将handler中的方法映射到RestInvocationHandler中去。最后会通过RestInvocationHandler中的execute方法来执行实际的业务逻辑。



public RestHandler getRestHandler(String path, String method)

这个方法是利用request的路径进行handle中的处理方法完全匹配。

/social/rest/activities/{guid}/@self/{activityid}

过程如下:首先是根据activites相匹配的@Service,则映射到ActivityHandler类。

然后会在HashMap中储存ActivityHandler@Operationhttpmethod属性的所有值作为Key,相关的处理路径作为value储存起来。然后根据具体的Method{guid}/@self/{activityid}路径匹配到一个特定的方法上,将这个方法利用java的反射机制映射到一个RestHandler上去。返回。

 

 

一般的处理过程:

 

 

 

DataServiceServlet

 

1.Get Security Token Set the header for Cross-Site Resource Sharing

2.所数据都有三种表现形式:JSON, XML, and Atom。所以需要设置相应的convertor进行数据的转换。

3.然后就交给handleSingleRequest()方法来处理 首先会调用自己的getRestHandler()方法,这个方法会把servletRequestHttp method转给HandlerRegistrygetRestHandler()方法来获取具体的处理方法。结果是取得一个和路径匹配的RestHandler

4.获得了RestHandler后,会判断是否是“GET”或者“HEAD”方法,否则需要个Reader来获取servletRequestbody

5.然后就是执行execute方法来处理请求,返回一个Future对象。利用Future对象封装成ResponseItem对象。最后设置servleResponse对象,做结果的处理和返回。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值