2010-08-11 210 views
9

我正在尋找適用於Java的SOAP客戶端。Java:簡單SOAP客戶端

Apache Axis看起來很臃腫。我不明白爲什麼Java中的事情必須如此複雜。例如,在PHP中,我所要做的就是:

<?php 
$global_service_wsdl='https://api.betfair.com/global/v3/BFGlobalService.wsdl'; 
$betfair=new SoapClient($global_service_wsdl); 

$params=array("request"=> 
    array("header"=> 
     array("clientStamp"=>0,"sessionToken"=>$session_token)),"locale"=>"" 
); 
$response=$betfair->getAllEventTypes($params); 
?> 

而我的$ response對象包含我需要的所有信息。

任何人都可以建議我將如何在Java中實現這樣的東西沒有太多的麻煩?

很多感謝,

〜編輯1〜

@jarnbjo:

這是非常有用的給我。我堅持的是我需要哪些導入代碼才能運行?

我跑這個命令: SH wsdl2java.sh -o輸出-a -uri https://api.betfair.com/global/v3/BFGlobalService.wsdl

而且內置的輸出。你認爲這比PHP更快嗎?另外,我有一個「異步」選項。這是否意味着我可以進行異步調用?這將是非常有用的。我想在基於Java的websocket服務器中運行所有這些。

+0

maxlols >>我不明白爲什麼事情都必須在Java中那麼複雜。 – 2015-09-01 10:45:16

回答

12

除非你要求不是由SOAP客戶端的標準Java API中提供的附加功能,你可以使用JDK的bin目錄(它指向你的WSDL URL wsimport工具),並讓它爲服務門面生成Java類。

隨着生成的類,你需要更多的Java代碼比你的PHP例子執行請求,但它仍然是合理的:

BFGlobalService betfair = new BFGlobalService_Service().getBFGlobalService(); 

APIRequestHeader header = new APIRequestHeader(); 
header.setClientStamp(0); 
header.setSessionToken("someSessionToken"); 

GetEventTypesReq req = new GetEventTypesReq(); 
req.setHeader(header); 
req.setLocale(""); 

GetEventTypesResp response = betfair.getAllEventTypes(req); 

這個例子失敗,錯誤,但可能是因爲會話令牌是無效的。

+0

非常感謝。請參閱編輯。 – Eamorr 2010-08-11 22:52:50

+2

提及導入工具+1。這是我聽到的第一個 – Webnet 2013-02-11 16:58:23

0

看看CXF

+1

嘿,我已經下載了,但我真的不知道從哪裏開始。我只想爲我的wsdl url提供一個SOAP客戶端對象,在它上面發起一些請求並查看一些響應。當然,只需要幾行Java即可滿足需要? – Eamorr 2010-08-11 22:16:56

2

的Java是靜態類型的,這意味着編譯器需要知道的任何方法之前,你可以在源代碼中直接調用它。這又意味着您需要描述Web服務的Java類存根,因此您可以調用某些東西。通常有一個Web服務棧的實用程序正在執行此操作。

您可能會發現這個問題有意思What methods exist to auto-generate java client stubs from WSDL files?

2

我會迴應CXF,但以一個如何使用它爲例。但是,這假定您已經運行CXF/JAXWS工具來基於wsdl生成Java代碼。

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 
factory.setServiceClass(TheGeneratedInterface.class); 
factory.setAddress("hostUrlGoesHere"); 
client = (TheGeneratedInterface) factory.create(); 
return client.methodNameGoesHere(request); 

要編寫的代碼並不難。更難的部分實際上是搞清楚如何從wsdl生成必要的Java代碼。這並不難,只是你必須得到正確的命令行咒語。