2012-07-13 106 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