我有一个powershell脚本,它将进行soap调用,并执行以下操作:1.连接承载WSDL的服务器(在应用程序术语中称为cell )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===============================================================================
发布于 2018-12-01 13:20:37
正如@格林兹评论:请不要使用SOAP::Lite,它很难看。在Perl中通过HTTP运行SOAP操作的事实上的标准是XML::编译::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 );现在,您已经准备好调用the服务了。您传递操作的名称和数据结构,如下所示:
my ( $answer, $trace ) = $wsdl->call( $ope, $data );如果出了什么问题,电话就会挂掉。成功后,它返回一个表示解析响应的Perl数据结构。就这样!
编译提供了许多有用的内省和调试方法。例如,编译后,可以使用以下方法打印所有可用操作的列表:
$wsdl->printIndex;要显示给定操作的输入数据结构的详细信息:
$wsdl->explain( $ope, PERL => "INPUT", recurse => 1 );在执行操作之后,可以使用跟踪对象获取有关事情发生方式的许多内部细节,例如:
$trace->printRequest;
$trace->printResponse;
$trace->printTimings;https://stackoverflow.com/questions/53566677
复制相似问题