【问题标题】:Rest-SOAP gateaway for external services (Spring + Camel)用于外部服务的 Rest-SOAP 网关(Spring + Camel)
【发布时间】:2012-07-13 11:23:54
【问题描述】:

我需要在 2 个外部服务之间构建 REST-SOAP 网关 第一个 Web 服务发出 SOAP 请求并等待 SOAP 响应。第二个服务(我的,用 Play Framework 1.2.4 编写)仅使用 RESTful 方法工作。出于多种原因,我不想将 SOAP 相关的东西与第二个服务集成。所以我需要一些第三个服务来在他们之间行动。

我已经研究过将 Spring web-app 与 Apache Camel 一起使用,但仍然无法全面了解,因为 Camel 的模块太多了。 CXF-RS 和 SOAP 组件看起来很有前途,但我不知道如何使用它们来实现代理。

首先,如何让 Camel 监听指定的 SOAP 请求。然后,如何将响应从 RESTful 服务路由回调用服务。

我尝试只使用弹簧配置来做到这一点。

【问题讨论】:

    标签: spring rest soap apache-camel


    【解决方案1】:

    Camel CXF 将为您的肥皂端点解决问题。

    首先你需要编写一个端点

    @WebService
    public interface QuoteInEndpoint {
    
      @WebResult(name = "quote")
      public Quote price(@WebParam(name = "symbol") String symbol);
    
    }
    

    那你需要声明一下

    <cxf:cxfEndpoint id="quoteIn" address="http://localhost:9002" serviceClass="my.package.QuoteInEndpoint" />
    

    然后您可以从此端点构建路由

    from("cxf:bean:quoteIn")//
            .process(new Processor() {
              @Override
              public void process(Exchange exchange) throws Exception {
                //do whatever you need to get your object and transform it for your rest service
              }
            })//
            .to("http://myplayframeworkserver/myservice")//
    

    Camel 将启动路由,在 localhost:9002 公开你的soap服务的wsdl,每个soap请求都会被发送到你的rest服务器。 process 方法可用于将您的对象塑造为您的休息服务的正确格式(我假设为 json)。您可以不使用处理器,而是使用另一个 Camel 组件来完成这项工作(Camel JSON,如果您需要 json)

    【讨论】:

    • 感谢您的回答和代码示例!但肥皂服务不是我的。它由另一家公司提供。我只是在我的 REST 服务和他们的 SOAP 服务之间代理请求-响应。
    【解决方案2】:

    没有直接的方法可以简单地在肥皂和休息之间进行代理。 REST 服务,都是关于资源和 CRUD - 创建/读取/更新/删除。有效负载可以是任何形式,通常是 JSON,但 XML、纯文本或任何其他格式都是有效的。 SOAP 是仅具有自定义定义方法的 XML。

    我了解 Camel 中与此相关的所有组件的混淆。

    在选择方法时,您需要牢记几个方面。

    • 您真正需要多少 SOAP 堆栈?很可能您只需要基本功能,例如接收简单的肥皂信封并提取有效负载而无需 WS-addressing、ws-security 等。

    • 您是采用合同优先还是代码优先方法?也就是说,您的soap 服务是否已经由java 类/接口定义,或者您是否有WSDL?

    • 您是否将骆驼实例部署在 servlet 容器(这很常见)中,例如 Tomcat、Jetty 或 JavaEE 应用服务器?如果您是这样,您可能需要使用该 servlet 容器来处理由于某种原因的请求(出于某种原因,例如 Web 服务器虚拟主机、防火墙等,从同一端口/服务器/域名获取所有请求)。那么CXF可能会有点棘手。否则,camel 可以使用内置的 jetty 核心设置监听器。

    所以: 先契约,然后在 serverletcontainer 中使用骆驼——我更喜欢 spring-ws,因为它很容易上手。 spring-ws component。只需在 spring 中进行初始连接,您甚至不需要从 WSDL 生成内容,只需指出要从哪个soap-action、uri 或 rootq 名称获取消息:

    from("spring-ws:soapaction:http://example.com/GetFoo?endpointMapping=#endpointMapping")
    

    那么你就有了 XML。

    如果您需要从 camel 托管 Web 服务,负载模式下的 CXF 相当不错,并且行为几乎相同。

    from("cxf:somename:http://localhost:8765?wsdl=somewsdlfile.wsdl&dataFormat=PAYLOAD")
    

    如果您已经在 J​​ava 中定义了服务,则可以将 SOAP dataformat 与 Jetty 组件一起使用以获得非常轻量级的解决方案。

    SoapJaxbDataFormat soap = new SoapJaxbDataFormat("com.example.customerservice", new      ServiceInterfaceStrategy(CustomerService.class));
    from("jetty:http://localhost:9832/soapsrv")
      .marshal(soap) // and other transforms here
      .to("http://somerestservicehost/srv");
    

    或者。使用带有 CXF 或 CXF-bean 的完整 CXF 解决方案。骆驼网站上有很多例子。但是该组件相当大,可能有些棘手。

    对于休息,也有选择,但那部分更直接。 Rest 主要是关于创建一些内容(通过从肥皂消息中提取它,并且可能将 xml 映射到 json),这可能是使用一些普通的旧 java 代码最容易实现的。然后只需向您的休息服务器调用一个 HTTP 端点。 HTTP4 或 HTTP 组件将为您完成很多工作。

    如果你喜欢 CXF,CXFRS 很好,并且可以提供一些帮助,特别是如果你想用类来建模你的休息服务

    【讨论】:

    • 谢谢! SpringWS 看起来很有希望。如果它可以侦听来自外部(非常外部:))SOAP 服务的请求。
    • 您展示了如何将一个 URL 转换为另一个,但是在将 REST 请求转换为 SOAP 时,我还需要转换 HTTP 方法。例如为了更新一个对象,我经常需要将 PUT 转换为 POST。使用 Camel 可以做到这一点吗?
    • 如果需要显式配置方法,可以这样操作:.setHeader(Exchange.HTTP_METHOD, constant("POST"))
    猜你喜欢
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    相关资源
    最近更新 更多