使用Perl SOAP :: Lite使用wsdl进行调用时获取“服务地址尚未指定...”

时间:2018-01-16 13:56:33

标签: perl soap wsdl

我正在尝试使用WSDL对http://www.webservicex.net/ConvertSpeed.asmx进行SOAP调用。

我的代码如下

use SOAP::Lite;

my $client = SOAP::Lite->new;
$client    = $client->service( "http://www.webservicex.net/ConvertSpeed.asmx?wsdl" );

my $soapResp = $client->call( "ConvertSpeed", 100, "kilometersPerhour", "milesPerhour" );

if ( $soapResp->fault ) {
    print $soapResp->faultstring;
}
else {
    print $soapResp->result;
}

这给了我以下错误

  

尚未使用SOAP :: Lite-> proxy()或服务描述指定服务地址

我认为WSDL应该提供服务地址,但它似乎并没有这样做。

我已尝试在http://www.webservicex.net/ConvertSpeed.asmx之后通过$client->proxy("http://www.webservicex.net/ConvertSpeed.asmx")将服务地址设置为$client->service(),但这只是给我一个错误说:

Server did not recognize the value of HTTP header SOAPAction: #ConvertSpeed

我假设WSDL应该提供服务地址,因此省略了$client->proxy()位并尝试了其他的东西。

这不同于链接方法,最终链接尽可能少(上面的代码)来改变调用的方式。

this answer我试过

$client->ConvertSpeed(100, "kilometersPerhour", "milesPerhour")

似乎什么也没有回归。

这是在Perl 5.10和SOAP :: Lite版本0.714上运行。

我不确定还有什么可以尝试,但我已经确认同样的SOAP调用可以在Python中运行(参见编辑)。

编辑:

from zeep import Client

client = Client('http://www.webservicex.net/ConvertSpeed.asmx?wsdl')
result = client.service.ConvertSpeed(100, 'kilometersPerhour', 'milesPerhour')

print(result)

1 个答案:

答案 0 :(得分:0)

我也把这个问题发给了PerlMonks,因为它在这里看起来并不好。根据我收到的答案there SOAP::Lite对于使用WSDL的复杂服务并不理想。相反,应使用uri()proxy()方法指定所有内容。如果要使用WSDL,则XML::Compile::WSDL11是要查看的模块。

答案使用SOAP::Lite而不使用WSDL为调用提供工作代码,如下所示:

$client = SOAP::Lite->new(
        uri   => 'http://www.webserviceX.NET/',
        proxy => 'http://www.webservicex.net/ConvertSpeed.asmx',
           );

$client->on_action(sub {"http://www.webserviceX.NET/ConvertSpeed"});
$client->autotype(0);
$sheader = SOAP::Header->new('');
$sheader->type(xml => '');
$client->ns('http://www.webserviceX.NET/','web');
$client->envprefix('soapenv');

push @request, SOAP::Data->name(speed => 100)->prefix('web');
push @request, SOAP::Data->name(FromUnit => 'kilometersPerhour')->prefix('web');
push @request, SOAP::Data->name(ToUnit => 'milesPerhour')->prefix('web');

$soapResp = $client->ConvertSpeed($sheader,@request);

print $soapResp->result,"\n";

如果我使用XML::Compile::WSDL11得到一个有效的例子,我会在这里发布。由于我不确定我是否会很快调查它,所以我决定至少发布这个问题,因为问题更侧重于使用带有SOAP::Lite的WSDL