0

我正在使用SOAP::LiteWSDL 定义的 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 服务。那么我怎么知道服务函数如何期望它们的参数呢?这就是我问题的核心。我考虑了解决方法的参数命名。

4

3 回答 3

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' )
于 2017-01-28T17:20:48.363 回答
0

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

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

您仍然需要知道预期的参数是什么,因为没有很多可用的自省(您可以有一个解决方法,因为如果您将未知的参数名称传递给类,它们将死掉,并且在错误消息中您将拥有列表可用参数,所以你可以抓住它并解析错误字符串。丑陋,但我没有找到另一种方法)。

于 2017-01-28T20:17:24.470 回答
-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";

您必须将proxyto http://mywsdl、to和、toname和to的值替换为您的 WSDL 命名空间。givenNamep1p2sayHellofoourn:HelloWorld

我也建议检查一下。所有请求都可以在没有 SOAP::Lite 的情况下完成。

于 2017-01-28T15:53:57.800 回答