首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用perl - WSDL URL的SOAP客户机是可用的。

使用perl - WSDL URL的SOAP客户机是可用的。
EN

Stack Overflow用户
提问于 2018-12-01 00:28:11
回答 1查看 883关注 0票数 2

我有一个powershell脚本,它将进行soap调用,并执行以下操作:1.连接承载WSDL的服务器(在应用程序术语中称为cell )2.在其中创建一个事件(警报)。3.断开与承载WSDL的服务器的连接(在应用程序术语中称为单元格),我想创建这个脚本的perl版本。这做了同样的精确操作,请帮助我的功能和例子。或者,如果可能的话,用perl重写下面的脚本。提前谢谢你:

PS脚本如下:

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

代码语言:javascript
复制
$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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-01 13:20:37

正如@格林兹评论:请不要使用SOAP::Lite,它很难看。在Perl中通过HTTP运行SOAP操作的事实上的标准是XML::编译::SOAP,它非常完整,维护良好,文档完整。然而,由于SOAP协议的固有复杂性,将您的头脑转移到它可能会有点复杂。下面的解释会让你开始工作。

首先,您必须加载模块:

代码语言:javascript
复制
use XML::Compile::SOAP11;
use XML::Compile::WSDL11;

然后,第一步是创建一个WSDL对象并加载WSDL文件:

代码语言:javascript
复制
my $wsdl = XML::Compile::WSDL11->new;
$wsdl->addWSDL($wsdl_file);

如果WSDL文件依赖于某些XSD文件,则必须先加载它们,然后在WSDL之前调用:

代码语言:javascript
复制
$wsdl->importDefinitions($xsd_file);

请注意,出于安全考虑,XML::编译永远不会尝试加载在线资源;您必须手动下载它们,然后从磁盘加载它们。

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

代码语言:javascript
复制
$wsdl->compileCalls( address => $url);

在编译时,您还可以传递自己的HTTP传输对象,而不是依赖XML::Compile默认值。当您希望在传输层上进行细粒度的控制时(比如设置HTTP代理,.),这是非常有用的。例如,使用LWP::UserAgent:

代码语言:javascript
复制
my $ua = LWP::UserAgent->new( show_progress => 1 );
$wsdl->compileCalls( address => $self->url, user_agent => $ua );

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

代码语言:javascript
复制
my ( $answer, $trace ) = $wsdl->call( $ope, $data );

如果出了什么问题,电话就会挂掉。成功后,它返回一个表示解析响应的Perl数据结构。就这样!

编译提供了许多有用的内省和调试方法。例如,编译后,可以使用以下方法打印所有可用操作的列表:

代码语言:javascript
复制
$wsdl->printIndex;

要显示给定操作的输入数据结构的详细信息:

代码语言:javascript
复制
$wsdl->explain( $ope, PERL => "INPUT", recurse => 1 );

在执行操作之后,可以使用跟踪对象获取有关事情发生方式的许多内部细节,例如:

代码语言:javascript
复制
$trace->printRequest;
$trace->printResponse;
$trace->printTimings;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53566677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档