Java: простой клиент SOAP
Я ищу SOAP-клиент для Java.
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.
5 ответов
Если вам не требуется дополнительная функциональность, не предоставленная SOAP-клиентом в стандартном API Java, вы можете использовать инструмент wsimport в каталоге bin JDK (укажите его на свой URL-адрес WSDL) и позволить ему генерировать классы 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);
этот пример завершается ошибкой, но, вероятно, из-за сеанса маркер является недействительным.
Java является статически типизированным, что означает, что компилятор должен знать любой метод, прежде чем вы сможете вызвать его непосредственно в исходном коде. Это, в свою очередь, означает, что вам нужны заглушки классов Java, описывающие веб-службу, поэтому вам есть что вызвать. Обычно существует утилита со стеком веб-служб, выполняющая именно это.
вы можете найти этот вопрос интересным какие существуют методы для автоматического создания клиентских заглушек java из файлов WSDL?
Я буду Эхо CXF, но с примером того, как его использовать. Однако это предполагает, что вы запустили инструмент CXF/JAXWS для создания кода Java на основе wsdl.
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass( TheGeneratedInterface.class );
factory.setAddress( "hostUrlGoesHere" );
client = (TheGeneratedInterface) factory.create();
return client.methodNameGoesHere( request );
писать код не так уж сложно. Более сложная часть на самом деле выясняет, как генерировать необходимый Java-код из wsdl. Это не сложно, просто вы должны получить правильное заклинание командной строки.
Проверьте " отправить или опубликовать сообщение SOAP с помощью SAAJ (документ / литерал)"... Это позволяет отправлять и получать XML через SOAP и управлять содержимым конверта SOAP напрямую без каких-либо синтаксического анализа и интерпретации/Привязок в объекты java, такие как при использовании wsimport...
http://users.skynet.be/pascalbotte/rcx-ws-doc/saajpost.htm
в отношении