SOAP :: Lite,参数寻址

时间:2017-01-28 10:42:39

标签: perl wsdl soaplite

我正在使用SOAP::Lite来使用WSDL定义的Web服务。

我的要求(工作正常)就是这样。

<soapenv:Envelope xmlns:soapenv="http://myabc">
 <soapenv:Header/>
 <soapenv:Body>
  <foo>
     <p1>max</p1>
     <p2>frank</p2>
  </foo>
.... 

我的perl代码。

my $service = SOAP::Lite->service ("http://mywsdl");
my $ret = $service->foo ("max", "frank");

这也有效。

但我喜欢命名/解决我的参数p1和p2以获得更大的灵活性。

我用哈希

尝试了
my %params = (p1 => "max", p2 => "frank");

以及SOAP::Data

my @params = (
 SOAP::Data->name (p1 => "max"), 
 SOAP::Data->name (p2 => "frank"));

但它没有那样工作。

  

预期字符串值而不是SOAP::Data引用

如何命名我的参数?

修改

我喜欢使用wsdl服务。那么我怎么知道服务函数如何期望它们的参数呢? 这是我的问题的核心。我想到了一个变通方法的参数命名。

3 个答案:

答案 0 :(得分:1)

如果要指定参数的名称,则应避免创建服务,这主要是为了避免此类内务管理

如果你只是call方法并提供其参数,那么它应该做你想要的

$client->call(foo =>
   SOAP::Data->name( p1 => 'max' ),
   SOAP::Data->name( p2 => 'frank' )
);

请注意

SOAP::Data->name( p1 => 'max' )

的无证收缩
SOAP::Data->name('p1')->value('max')

SOAP::Data->new( name => 'p1', value => 'max' )

答案 1 :(得分:0)

如果您想使用WSDL文件(欢迎来到地狱),您需要使用SOAP::WSDL而不是SOAP :: Lite。然后你将有一个名为wsdl2perl.pl的实用程序。如果在wsdl文件上运行它,它将创建大量的perl代码,包括wsdl文件中定义的每个服务的一些类。

然后在您的代码中实例化您要使用的特定端点的新实例,然后调用此对象以此端点上提供的服务命名的方法(您不再使用call方法),传递带有所有参数的哈希引用。

你仍然需要知道预期的参数是什么,因为没有很多可用的内省(你可以有一个解决方法,因为如果你将一个未知的参数名称传递给他们将死的类,你会在错误信息中有可用参数列表,所以你可以捕获它并解析错误字符串。丑陋,但我没有找到另一种方法来做到这一点。)

答案 2 :(得分:-1)

如果您通过调用service()从服务描述创建存根,我认为您无法命名参数。

如果要为参数指定值,CPAN上有一个示例。

功能sayHello

 <sayHello xmlns="urn:HelloWorld">
   <name xsi:type="xsd:string">Kutter</name>
   <givenName xsi:type="xsd:string">Martin</givenName>
 </sayHello>

SOAP请求

 use SOAP::Lite;
 my $soap = SOAP::Lite->new( proxy => 'http://localhost:81/soap-wsdl-test/helloworld.pl');
 $soap->default_ns('urn:HelloWorld');
 my $som = $soap->call('sayHello',
    SOAP::Data->name('name')->value('Kutter'),
    SOAP::Data->name('givenName')->value('Martin')
 );
 die $som->faultstring if ($som->fault);
 print $som->result, "\n";

您必须将proxy的值http://mywsdlnamegivenName替换为p1p2,{{1} } sayHellofoo到您的WSDLs名称空间。

我还建议您查看this。所有请求都可以在没有SOAP :: Lite的情况下完成。