2012-07-13 107 views
2

休息的SOAP gateaway我需要建立2个外部服务之间的REST-SOAP gateaway 第一个Web服务,使SOAP请求,并等待SOAP响应。第二项服务(我的,使用Play Framework 1.2.4编写的)只能使用RESTful方法。我不想将SOAP相关的东西与第二种服务集成在一起,原因很多。所以我需要一些第三种服务来在他们之间行事。外部服务(春季+骆驼)

我已经调查使用Spring Web的应用程序与Apache的骆驼,但因为有骆驼那么多的模块仍然不能得到完整的图片。 CXF-RS和SOAP组件看起来很有希望,但我无法弄清楚如何使用它们来实现代理。

首先,如何让Camel侦听指定的SOAP请求。然后,如何将响应从RESTful服务路由回到呼叫服务。

我试过只用弹簧配置。

回答

3

没有简单的方法来简单地代理肥皂和休息。 REST服务,全部关于资源和CRUD - 创建/读取/更新/删除。负载可以是任何东西,通常是JSON,但XML,纯文本或任何其他格式都是有效的。 SOAP只能通过自定义定义的方法来使用XML。

我了解所有的骆驼与此相关的组件的混乱。

有你需要有一点,同时艇员选拔你的方法的几个方面。

  • 你真的需要多少SOAP协议栈?最有可能你只想要的基本featuers,如接收一个简单的肥皂信封和提取有效载荷没有WS-addressing,ws-security等。

  • 你有合同第一或代码优先的方法吗?也就是说,您是否已经通过java类/接口定义了您的soap服务,或者您是否拥有WSDL?

  • 你已经部署了骆驼实例的servlet容器内(这是很常见的),如Tomcat,Jetty的或的JavaEE应用服务器?如果你,你可能需要使用该servlet容器来处理请求(由于某些原因,例如Web服务器虚拟主机,防火墙等,从同一个端口/服务器/域名获得所有请求)。然后CXF可能会有点棘手。否则,骆驼可以用内置的码头核心提供听众。

所以: 合同第一和骆驼里面serverletcontainer - 我更喜欢春天-WS,因为它很容易上手。 spring-ws component。只是做春季初始wireing,你甚至都不需要从WSDL生成的东西,只是简单地指出哪肥皂行动,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") 

如果你有definied在Java中已经是服务,你可以使用SOAP dataformat与码头成分得到一个非常轻量级的解决方案。

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很重要的是创建一些内容(通过从soap消息中提取它,也许将xml映射到json),这可能是一些简单的旧Java代码最容易实现的。然后,只需向您的其余服务器调用HTTP端点即可。 HTTP4或HTTP组件将为你做很多事情。

CXFRS是好的,如果你喜欢CXF,并能提供一些帮助,特别是如果你想你的休息与服务类模型

+0

谢谢! SpringWS看起来很有希望。如果它可以侦听来自外部(非常外部:)的SOAP服务的请求。 – JohnGray 2012-07-14 11:28:48

8

Camel CXF会做的伎俩为您的SOAP端点。

首先,你需要编写一个端点

然后,你需要声明它

<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")// 

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

+0

谢谢您的回答和代码示例!但肥皂服务不是我的。它由另一家公司提供。我只是在我的REST服务和它们的SOAP服务之间代理请求 - 响应。 – JohnGray 2012-07-14 11:24:07