我在使用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";
答案 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"};
});