我有一个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;