2010-08-11 180 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代码。这并不难,只是你必须得到正确的命令行咒语。