使用Apache Camel使用RESTful Web服务

时间:2012-08-21 13:29:24

标签: rest oauth-2.0 apache-camel

我正在尝试使用camel来使用一个安静的Web服务。

为此我正在配置动态端点url,因为RESTful url是在运行时创建的。每次我使用以下CamelContext类方法检查特定端点url是否在我的camel上下文中注册为路由。

端点hasEndpoint(String uri);

在这种情况下,如果端点未注册,那么我使用自定义Route Builder添加到我的驼峰上下文的路由。

我正在使用camel HTTP组件。到目前为止,这对我来说还不错。

但是,我认为性能明智并不好,因为每次我必须检查路由是否注册了驼峰上下文,如果没有,则在进行webservice呼叫之前注册相同的路径。

有人可以告诉我是否有更好的方法在驼峰中使用RESTful Web服务?

我还想知道我使用的RESTful网络服务是否使用OAuth 2.0协议,我是否需要更改代码中的任何内容,因为我只是在消费它?

此致,Nilotpal


感谢您的回复。

我正在检查路由是否已经存在,以确保我最终不会向驼峰上下文添加重复的路由。

关于长寿路线和路线动态,请你解释一下这个问题吗?如何实施路线动态?

如果你能指出一些CXF-RS生产者的例子,也会有所帮助。我阅读了CXFRS的文档,但无法理解它。

由于 Nilotpal

2 个答案:

答案 0 :(得分:1)

究竟为什么在拨打电话之前需要检查路由是否已注册?您可能应该设置一个更长寿的路线并将动态路由到resfull资源。

对于Rest with camel,我认为HTTP组件做得很好,但也有更高级别的组件可供使用,更多是为REST设计的。 CXFRSRestlet,可以在Apache Camel源单元测试中找到restlet的生成器示例,例如RestletProducerGetTest.java

至于oAuth 2.0,Camel内置了一些oAuth支持,特别是对于谷歌。寻找gauth component。甚至有一个教程,但它可能与您的案例不一致,它仍然可能提供一些背景知识,以便您可以解决您的问题:http://camel.apache.org/tutorial-oauth.html

答案 1 :(得分:0)

CamelContext context = new DefaultCamelContext();

我的目标

我试图拦截传入的请求,并根据传入请求的ip我要调用get offer的动态端点

context.addRoutes(new RouteBuilder(){
     public void configure(){

     from("jetty:localhost:9000/offers")
     .process(new Processor(){
         public void process(Exchange exchange) throws Exception {

            //getting the request object
            HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class);
            //Extracting information from the request
            String requestIP=req.getRemoteAddr();

            /**
             * After getting the ip address i do necessay processing
             * and then add a property to exchange object.
             * Destination ip address is the address to which i want to   
             * send my request
             */

           exchange.setProperty("operatorAddress",destinationIpAddress);


       }
      })
     .to("direct:getOffers")
     .end();
}
});

现在我将调用getOffers端点

所以首先我会注册

context.addRoutes(new RouteBuilder(){
     public void configure(){
         from("direct:getOffers")
         .toD("jetty:${property.operatorAddress}/api/v2.0/offers? 
          bridgeEndpoint=true")
        .end();

    }
});

所以我们可以访问交换对象的operatorAddress属性

${property.operatorAddress}

当我们有动态路线时,我们需要调用

.toD()   and not .to()