Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于外部服务的Rest SOAP网关(Spring+Camel)_Spring_Rest_Soap_Apache Camel - Fatal编程技术网

用于外部服务的Rest SOAP网关(Spring+Camel)

用于外部服务的Rest SOAP网关(Spring+Camel),spring,rest,soap,apache-camel,Spring,Rest,Soap,Apache Camel,我需要在2个外部服务之间构建REST-SOAP网关 第一个web服务发出SOAP请求并等待SOAP响应。在Play Framework 1.2.4中编写的第二个service mine仅使用RESTful方法工作。出于许多原因,我不想将SOAP相关的东西与第二服务集成在一起。所以我需要一些第三种服务在他们之间起作用 我已经研究过将SpringWeb应用程序与ApacheCamel一起使用,但仍然无法获得完整的信息,因为Camel有太多的模块。CXF-RS和SOAP组件看起来很有前途,但我不知道如

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

我已经研究过将SpringWeb应用程序与ApacheCamel一起使用,但仍然无法获得完整的信息,因为Camel有太多的模块。CXF-RS和SOAP组件看起来很有前途,但我不知道如何使用它们实现代理

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

我尝试仅使用spring配置来完成此操作。

将为您的soap端点完成此操作

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

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

Camel将启动路由,在localhost:9002公开soap服务的wsdl,并且每个soap请求都将发送到rest服务器。process方法可用于将对象塑造为rest服务的正确格式,我假定为json。如果需要json,您可以使用另一个Camel组件来完成这项工作,而不是使用处理器。在soap和rest之间没有简单的代理方法。REST服务,是关于资源和CRUD的—创建/读取/更新/删除。负载可以是任何形式,通常是JSON,但XML、纯文本或任何其他格式都是有效的。SOAP是XML,仅具有自定义定义的方法

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

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

您真正需要多少SOAP堆栈?很可能您只需要基本功能,例如接收一个简单的soap信封并提取负载,而不需要WS-addressing、WS-security等

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

您是否将您的camel实例部署在一个非常常见的servlet容器中,例如Tomcat、Jetty或JavaEE应用服务器?如果您需要,您可能需要使用该servlet容器来处理出于某种原因的请求,以获取来自相同端口/服务器/域名的所有请求,例如web服务器虚拟主机、防火墙等。那么CXF可能有点棘手。否则,camel就可以使用内置的jetty内核安装侦听器

因此: 契约优先和在serverletcontainer中使用camel-我更喜欢SpringWS,因为它很容易入门。只需在spring中进行初始连接,您甚至不需要从WSDL生成内容,只需指出从哪个soap操作、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")
如果您已经用Java定义了服务,那么您可以使用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主要是通过从soap消息中提取内容来创建一些内容,也许还可以将xml映射到json,这可能是使用一些简单的旧java代码最容易实现的。然后只需向rest服务器调用HTTP端点。HTTP4或HTTP组件将为您完成很多这方面的工作


如果您喜欢CXF,CXFRS很好,并且可以提供一些帮助,特别是如果您想用类对rest服务建模

感谢您的回答和代码示例!但soap服务不是我的。它是由另一家公司提供的。我只是想在我的REST服务和他们的SOAP服务之间代理请求响应。谢谢!春天看起来很有希望。如果它可以侦听来自外部的请求,那么非常外部:SOAP服务。您演示了如何将一个URL转换为另一个URL,但是在将REST请求转换为SOAP时,我还需要转换HTTP方法。e、 为了更新一个对象,我经常需要将PUT转换为POST。是否可以使用Camel执行此操作?如果需要显式配置该方法,请执行以下操作:.setHeaderExchange.HTTP_method,constantPOST
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");