我正在寻找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 output -a -uri https://api.betfair.com/global/v3/BFGlobalService.wsdl
并构建输出。你认为这比PHP快吗?另外,我有一个“异步”选项。这是否意味着我可以进行异步调用?那将非常有用。我想在基于Java的websocket服务器中运行所有这些。
答案 0 :(得分:13)
除非您需要标准Java API中SOAP客户端未提供的其他功能,否则您可以在JDK的bin目录中使用wsimport工具(将其指向您的WSDL URL),并让它为服务外观生成Java类。
使用生成的类,您需要比PHP示例中更多的Java代码来执行请求,但它仍然是合理的:
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);
此示例因错误而失败,但可能是因为会话令牌无效。
答案 1 :(得分:2)
Java是静态类型的,这意味着编译器需要知道任何方法才能直接在源代码中调用它。这反过来意味着您需要描述Web服务的Java类存根,因此您可以调用一些东西。通常有一个带有Web服务堆栈的实用程序就是这样做的。
您可能会发现这个问题很有意思What methods exist to auto-generate java client stubs from WSDL files?
答案 2 :(得分: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代码。这并不难,只需要获得正确的命令行咒语。
答案 3 :(得分:2)
选中“使用SAAJ发送或发布SOAP消息(文档/文字)”... 它使您能够通过SOAP发送和获取XML并直接操作SOAP信封的内容,而无需对java对象进行任何解析和解释/绑定,例如当您使用wsimport时...
http://users.skynet.be/pascalbotte/rcx-ws-doc/saajpost.htm
此致
答案 4 :(得分:0)
查看CXF