Perl SOAP::Lite,参数寻址

Perl SOAP::Lite,参数寻址,perl,wsdl,soaplite,Perl,Wsdl,Soaplite,我正在使用WSDL定义的Web服务 我的要求(很好)是这样的 <soapenv:Envelope xmlns:soapenv="http://myabc"> <soapenv:Header/> <soapenv:Body> <foo> <p1>max</p1> <p2>frank</p2> </foo> .... 这也行得通 但我喜欢命名/寻址参数p1和

我正在使用WSDL定义的Web服务

我的要求(很好)是这样的

<soapenv:Envelope xmlns:soapenv="http://myabc">
 <soapenv:Header/>
 <soapenv:Body>
  <foo>
     <p1>max</p1>
     <p2>frank</p2>
  </foo>
.... 
这也行得通

但我喜欢命名/寻址参数p1和p2,以获得更大的灵活性

我试了一下

my %params = (p1 => "max", p2 => "frank");
也有

但它不是这样运作的

应为字符串值,而不是
SOAP::Data
reference

你知道如何命名我的参数吗

编辑

我喜欢使用wsdl服务。那么我如何知道服务函数如何期望它们的参数呢??
这是我问题的核心。我考虑了为解决方案命名参数

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

如果要为参数指定值,上提供了一个示例

函数sayHello

 <sayHello xmlns="urn:HelloWorld">
   <name xsi:type="xsd:string">Kutter</name>
   <givenName xsi:type="xsd:string">Martin</givenName>
 </sayHello>
您必须将
proxy
的值替换为
http://mywsdl
name
givenName
p1
p2
sayHello
foo
urn:HelloWorld
到WSDLs命名空间


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

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

如果您只是
调用
方法并提供其参数,那么它应该做您想做的事情

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

SOAP::Data->name( p1 => 'max' )
是一种无文件记录的合同

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


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

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


您仍然需要知道需要哪些参数,因为没有太多的内省可用(您可以有一个解决方法,因为如果您将未知参数名称传递给类,它们将死亡,并且在错误消息中,您将有可用参数的列表,因此您可以捕获该参数并解析错误字符串。很难看,但我没有找到其他方法).

此处缺少大量信息。您对哈希值
%params
做了什么?您在使用哈希时发现了什么问题?您对数组
@params
做了什么?字符串值预期错误在源中的何处出现(文件和行号)?我同意使用wsdl服务并命名参数不是很明智。但我如何知道服务的创建函数具有哪些参数以及顺序是什么?“所有请求都可以在没有
SOAP::Lite
的情况下完成。”可能是这样,但没有多大帮助。这是一个答案,它涉及到大量XML的手工编码,而这正是
SOAP
模块所要避免的。@Borodin:恐怕你错了。用SOAP::Lite构建一个巨大的嵌套调用比用SOAP客户端解析一次WSDL要花费更长的时间(例如回飞棒)而且,你似乎还不明白我的答案是基于SOAP::Lite的,引用的链接或多或少只是一个想法。这不是一个庞大的嵌套调用。你在谈论编码时间、执行时间、网络时间吗?我认为使用
SOAP::SQLite
(除非计算对堆栈溢出的引用)。我也知道你的最后一句话是概念性的,但你认为我不能对此发表评论,还是不能改进?我还想指出,堆栈溢出投票是有意匿名的。即使你认为你知道谁投了票,目的是你应该表现得好像你不知道一样。针锋相对的投票是unc在最好的情况下是构造性的,并且总是违反规则。@user3606329:“您的评论都是基于猜测的”。不是。它们是基于我对Perl语言和堆栈溢出的理解。“并且对于正常的讨论来说似乎过于激进”如果你这么想的话,我很抱歉。我的意图是始终做到包容和自由。我不明白的是这如何提供更大的灵活性。这是更多的代码,我认为顺序仍然相关。但这是OP的声明,而不是你的。SOAP::WSDL集成在SOAP::Lite中,不应再使用。wsdl2perl不是requ我需要SOPA::Lite wsdl服务。那么知道服务函数有哪些参数以及它们的顺序又有什么奇迹呢???在
SOAP::Lite
中有
stubmaker.pl
。也许浏览它生成的代码可以给出如何访问参数的提示。似乎每个服务类都有一个
parameters
方法返回参数具有名称和类型的
SOAP::Data
对象列表。可能:
SOAP::Schema->new(parse=>$file)->services()->{$service}->{'parameters'}
另请参见
$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' )