2012-02-20 90 views
1

我使用SOAP :: Lite与“SOAP”-Service-WSDL(ASMX响应)进行通信。 此服务需要的参数数组,像这样:SOAP :: Lite在复杂类型“Array”上生成“溢出”

<scriptParameters> 
    <string>string</string> 
    <string2>string2</string2> 
</scriptParameters> 

在Perl我使用下面的代码:

my @args; 
my @params; 
foreach (keys %{$self->{args}}) { 
    push(@params, SOAP::Data->name($_ => $self->{args}->{$_})->type("")); 
} 
push(@data, SOAP::Data->name("scriptParameters" => SOAP::Data->value(\@params)->type(""))->type("")); 

但是,这将创建下列XML:

<scriptParameters soapenc:arrayType="xsd:anyType[11]" xsi:type="namesp20"> 
    <job_id xsi:type="xsd:int">18381</job_id> 
    <dump xsi:type="xsd:int">0</dump> 
</scriptParameters 

注意soapenc:arrayType ... -stuff在scriptParameters-Element中。

现在的问题是,ASMX服务不能识别scriptParameters数组(我认为是因为soapenc东西(不幸的是这不是可调试的)。有没有人有一个想法,我可以摆脱额外的数据?

谢谢:)

回答

0

不知道实际的服务,不能够与各种选项进行实验,这是一个有点困难。但根据我的经验,“soapenc:arrayType”的使用表明SOAP :: Lite认为服务是RPC /编码SOAP服务而不是文档/文字或RPC /文字。因此,请检查您正在使用哪种方法创建服务代理,'$ soap-> service($ WSDL)'方法采用RPC /编码,但'$ soap-> proxy()'方法允许更多控制,代价是另外一些复杂性。

说服SOAP :: Lite生成正确的XML可能有点棘手。看看下面的网站提供了如何使用SOAP来构建专用的数据结构的一些提示::精简版:

从后来的示例代码对于EB眼Web服务(ebeye_soaplite.pl)可能是最有用的,因为它使用列表/数组很多。

根据你是如何绑定到SOAP :: Lite,你可能想看看替代品。我发现XML :: Compile :: SOAP比使用复杂类型的文档/文字SOAP服务更容易使用。