2

我需要在 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 服务路由回调用服务。

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

4

2 回答 2

8

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 组件来完成这项工作,而不是使用处理器(如果您需要 json ,请使用Camel JSON )

于 2012-07-13T15:15:51.180 回答
3

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

我理解骆驼中与此相关的所有组件的困惑。

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

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

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

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

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

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

然后你就有了 XML。

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

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

如果您已经在 J​​ava 中定义了服务,您可以使用带有 Jetty 组件的SOAP 数据格式来获得一个非常轻量级的解决方案。

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 很好,并且可以提供一些帮助,特别是如果你想用类来建模你的休息服务

于 2012-07-13T15:33:01.190 回答