没有直接的方法可以简单地在肥皂和休息之间进行代理。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")
如果您已经在 Java 中定义了服务,您可以使用带有 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 很好,并且可以提供一些帮助,特别是如果你想用类来建模你的休息服务