Клиент SOAP с использованием perl - доступен WSDL URL - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть сценарий powershell, который выполняет мыльный вызов и выполняет следующие операции: 1. Подключается к серверу, на котором размещается WSDL (называемый ячейкой в ​​терминологии приложения) 2. Создает в нем событие (оповещение).3.Отключается от сервера, на котором размещается WSDL (называемый ячейкой в ​​терминологии приложения). Я хочу создать Perl-версию этого скрипта, которая выполняет те же точные операции. Пожалуйста, помогите мне с функциями и примерами.или, если возможно, переписав приведенный ниже скрипт на Perl.Заранее большое спасибо:

скрипт PS выглядит так:

==============================================================================

$severity = "MAJOR"

$msg = "Test event from Powershell"
$cellname = "mycell"

$url = "http://iiwshostname:9080/imws/services/ImpactManager/"
$headers = @{ "SOAPAction" = "Connect"}
$soap = [xml]@"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:imap="http://blueprint.bmc.com/ImapiElems">
   <soapenv:Header/>
   <soapenv:Body>
      <imap:Connect>
         <imap:userName>admin</imap:userName>
         <imap:password>admin</imap:password>
         <imap:imname>$cellname</imap:imname>
         <imap:bufferType>BMCII_BUFFER_MODE_DEFAULT</imap:bufferType>
      </imap:Connect>
   </soapenv:Body>
</soapenv:Envelope>
"@
[xml]$ret = Invoke-WebRequest $url -Method post -ContentType 'text/xml' -Body $soap -Headers $headers
$connectionId = $ret.GetElementsByTagName("imap:connectionId").'#text'

$headers = @{ "SOAPAction" = "SendEvent"}
$soap = [xml]@"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:imap="http://blueprint.bmc.com/ImapiElems" xmlns:bas="http://blueprint.bmc.com/BasicTypes" xmlns:even="http://blueprint.bmc.com/Event">
   <soapenv:Header/>
   <soapenv:Body>
      <imap:SendEvent>
         <imap:connection>$connectionId</imap:connection>
         <imap:message>    
            <bas:NameValue_element>    
               <bas:name>msg</bas:name>    
               <bas:value>    
                  <bas:string_value>$msg</bas:string_value>    
               </bas:value>    
               <bas:value_type>STRING</bas:value_type>    
            </bas:NameValue_element>    
            <bas:NameValue_element>    
               <bas:name>severity</bas:name>    
               <bas:value>    
                  <bas:string_alue>$severity</bas:string_value>    
               </bas:value>   
               <bas:value_type>STRING</bas:value_type>    
            </bas:NameValue_element>              
            <even:subject></even:subject>    
         </imap:message>    
         <imap:timeout>60</imap:timeout>    
         <imap:messageClass>EVENT</imap:messageClass>    
         <imap:messageType>MSG_TYPE_NEW_EVENT</imap:messageType>    
      </imap:SendEvent>    
   </soapenv:Body>    
</soapenv:Envelope>    
"@    
[xml]$ret = Invoke-WebRequest $url -Method post -ContentType 'text/xml' -Body $soap -Headers $headers    

$mc_ueid = $ret.GetElementsByTagName("imap:response").'#text'    

$headers = @{ "SOAPAction" = "Disconnect"}    
$soap = [xml]@"    
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soapenvelope/" xmlns:imap="http://blueprint.bmc.com/ImapiElems">
       <soapenv:Header/>
       <soapenv:Body>
          <imap:Disconnect>
             <imap:connection>$connectionId</imap:connection>
             <imap:deleteBuffer>No</imap:deleteBuffer>    
      </imap:Disconnect>    
   </soapenv:Body>    
</soapenv:Envelope>    
"@    
$ret = Invoke-WebRequest $url -Method post -ContentType 'text/xml' -Body $soap -Headers $headers    

write-host $mc_ueid

===============================================================================

1 Ответ

0 голосов
/ 01 декабря 2018

Как прокомментировал @Grinnz: пожалуйста, не используйте SOAP :: Lite, это ужасно.Де-факто стандартом для выполнения операций SOAP через HTTP в Perl является XML :: Compile :: SOAP , который является довольно полным, хорошо поддерживается и тщательно документирован.Тем не менее, это может быть немного сложным, чтобы разобраться с этим из-за внутренней сложности протокола SOAP.Следующее объяснение должно помочь вам начать работу.

Прежде чем загрузить все модули:

use XML::Compile::SOAP11;
use XML::Compile::WSDL11;

Затем первый шаг - создать объект WSDL и загрузить файл WSDL:

my $wsdl = XML::Compile::WSDL11->new;
$wsdl->addWSDL($wsdl_file);

Если ваш WSDL-файл зависит от некоторых XSD-файлов, вы должны сначала загрузить их, до WSDL, вызвав:

$wsdl->importDefinitions($xsd_file);

Обратите внимание, что по соображениям безопасности XML:: Компиляция никогда не будет пытаться загрузить онлайн-ресурсы;Вы должны загрузить их вручную, а затем загрузить их с диска.

Второй шаг заключается в компиляции объекта.Это на самом деле создаст постоянные ссылки на код в объекте, которые вы можете впоследствии вызывать для выполнения операций.Вы передаете URL целевой службы в качестве аргумента компилятору.Например, следующий вызов компилирует все доступные операции:

$wsdl->compileCalls( address => $url);

Во время компиляции у вас также есть возможность передать свой собственный транспортный объект HTTP вместо того, чтобы полагаться на значения по умолчанию XML :: Compile.Это полезно, когда вы хотите детализированное управление на транспортном уровне (например, установка прокси HTTP, ...).Например, с помощью LWP :: UserAgent:

my $ua = LWP::UserAgent->new( show_progress => 1 );
$wsdl->compileCalls( address => $self->url, user_agent => $ua );

Теперь вы готовы вызвать веб-сервис.Вы передаете название операции и структуру данных следующим образом:

my ( $answer, $trace ) = $wsdl->call( $ope, $data );

Если что-то пойдет не так, вызов прекратится.В случае успеха он возвращает структуру данных Perl, которая представляет проанализированный ответ.Вот и все!

XML :: Compile предоставляет множество полезных методов самоанализа и отладки.Например, после компиляции вы можете распечатать список всех доступных операций с помощью:

$wsdl->printIndex;

Чтобы отобразить детали структуры входных данных данной операции:

$wsdl->explain( $ope, PERL => "INPUT", recurse => 1 );

ПослеОперация была выполнена, объект трассировки может быть использован для получения многих внутренних деталей о том, как все произошло, например:

$trace->printRequest;
$trace->printResponse;
$trace->printTimings;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...