使用perl-WSDLURL的SOAP客户端是可用的



我有一个powershell脚本,它将进行soap调用,并执行以下操作: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

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

正如@Grinz所评论的:请不要使用SOAP::Lite,它很难看。事实上,在Perl中通过HTTP运行SOAP操作的标准是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::Compile永远不会尝试加载在线资源;您必须手动下载它们,然后从磁盘加载它们。

第二步是编译对象。这实际上会在对象中创建持久的代码引用,之后可以重复调用这些引用来执行操作。您将目标服务的url作为参数传递给编译器。例如,以下调用编译所有可用的操作:

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

在编译时,您还可以传递自己的HTTP传输对象,而不是依赖XML::编译默认值。当您希望对传输层进行细粒度控制时(如设置HTTP代理等(,这很有用

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

现在您已经准备好调用Web服务了。您传递操作的名称和数据结构,如下所示:

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;

相关内容

  • 没有找到相关文章

最新更新