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

в отношении


посмотри CXF