我正在使用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服务。那么我怎么知道服务函数如何期望它们的参数呢? 这是我的问题的核心。我想到了一个变通方法的参数命名。
答案 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://mywsdl
,name
和givenName
替换为p1
和p2
,{{1} } sayHello
和foo
到您的WSDLs名称空间。
我还建议您查看this。所有请求都可以在没有SOAP :: Lite的情况下完成。