【问题标题】:Consuming a RESTful web service using Apache Camel使用 Apache Camel 使用 RESTful Web 服务
【发布时间】:2012-08-16 20:43:09
【问题描述】:

我正在尝试使用骆驼来使用一个宁静的 Web 服务。

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

端点 hasEndpoint(String uri);

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

我为此使用骆驼 HTTP 组件。到目前为止,这对我来说工作正常。

但是,我认为在性能方面这并不好,因为每次我必须检查路由是否已注册到骆驼上下文中,如果没有,则在进行 web 服务调用之前进行注册。

有人可以告诉我是否有更好的方式来使用骆驼中的 RESTful Web 服务?

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

问候,尼洛帕尔


感谢您的回复。

我正在检查该路线是否已经存在,以确保我最终不会将重复的路线添加到骆驼上下文中。

关于长寿命路线和路线动态,你能解释一下吗?如何实现路由动态?

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

谢谢 尼洛特帕

【问题讨论】:

    标签: rest oauth-2.0 apache-camel


    【解决方案1】:

    究竟为什么在拨打电话之前需要检查路由是否已注册?您或许应该设置一条寿命更长的路线和路线动态以重新获得资源。

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

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

    【讨论】:

      【解决方案2】:
      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();
      
          }
      });
      

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

      ${property.operatorAddress}
      

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

      .toD()   and not .to()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-04
        • 1970-01-01
        • 1970-01-01
        • 2013-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多