soap lite传递字符串参数

时间:2011-11-08 13:17:03

标签: web-services perl soap

我在使用Perl传递字符串参数时遇到问题。以下代码

#!/usr/bin/perl -w
use SOAP::Lite;
my $service = SOAP::Lite->service('http://localhost:8080/greeting?wsdl');
print $service->greetClient('perl wooooo'), "\n";

结果

  

问候 null !祝你有美好的一天......

类似的python代码

from suds.client import Client
client = Client('http://localhost:8080/greeting?wsdl')
print client.service.greetClient('python wooooo')

完美运作

  

问候 python wooooo !祝你有美好的一天......

我尝试设置不同的编码

print $service->encoding('utf-8')->greetClient("perl wooooo"), "\n";

具有相同的结果。

SOAP监视器显示在Perl

的情况下没有arg0
<greetClient xsi:nil="true"  xsi:type="tns:greetClient" />

出现在Python的情况下

<ns0:greetClient>
  <arg0>python wooooo</arg0>
</ns0:greetClient>

可能有什么问题?

与Python相比,使用Perl实现SOAP客户端为何如此复杂?

编辑: 的

最后,以下解决方案正在运行

#!/usr/bin/perl -w
use strict;
use warnings;
use XML::Compile::SOAP11;
use XML::Compile::WSDL11;
use XML::Compile::Transport::SOAPHTTP;

my $soap = XML::Compile::WSDL11->new('c:/temp/greeting.wsdl');
my $call = $soap->compileClient('greetClient');
print $call->(arg0 => 'perl wooooo'){'greetClientResponse'}{'return'}, "\n";

2 个答案:

答案 0 :(得分:1)

SOAP::Lite可能非常糟糕。您可以试试XML::Compile::SOAP

use strict;
use warnings;
use XML::Compile::SOAP11;
use XML::Compile::WSDL11;
use XML::Compile::Transport::SOAPHTTP;

my $soap = XML::Compile::WSDL11->new(
    'http://localhost:8080/greeting?wsdl',
    schema_dirs => [
        'c:/soft/Perl/site/lib/XML/Compile/SOAP11/xsd'
        'c:/soft/Perl/site/lib/XML/Compile/XOP/xsd'
        'c:/soft/Perl/site/lib/XML/Compile/xsd'
    ]
);
$soap->compileCalls;
my ( $response, $trace ) = $soap->call( 'greetClient', arg0 => 'perl wooooo' );
$trace->printResponse;

$response将通过XML::Simple将呼叫响应转换为hashref,这可能就是您所需要的。 $trace对象可以很方便地查看原始XML响应的内容。

答案 1 :(得分:1)

不幸的是,我看不到您的WSDL。

但是对于SOAP :: Lite,我没有看到你设置proxy(端点)和uri

您也可能需要更改on_action行为。默认情况下,SOAP::Lite想要使用“#”连接。

所以这些方面的东西可能有效。

$service->proxy( $uri_of_my_end_point );
$service->uri( $schema_namespace );
$service->on_action( sub {
    my ( $uri, $method ) = @_;
    my $slash = $uri =~ m{/$} ? '' : '/';
    return qq{"$uri$slash$method"};
});