Perl和复杂SOAP请求

时间:2011-04-12 15:41:56

标签: perl soap soaplite

我需要使用Perl进行一些有点复杂的soap查询,最好使用SOAP::Lite。我知道该服务处于活动状态,并且已成功从另一端收回错误。这是我需要制作的肥皂查询:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
    <GetCategories xmlns="http://webservices.uship.com">
        <token>string</token>
    </GetCategories>
</soap:Body>
</soap:Envelope>

我通过Google对此进行了研究,但无济于事。

更新:到目前为止使用的代码是

use SOAP::Lite; 
print SOAP::Lite
 -> uri('webservices.uship.com/uShipsvc.asmx?WSDL';)
 -> proxy('http:/webservices.uship.com')
 -> GetCategories('myToken')
 -> result;

返回

  

500个错误的主机名,500个无法连接到:soap2.pl第2行的80(错误的主机名'')

4 个答案:

答案 0 :(得分:3)

从SOAP :: Lite Getting Started Guide开始,您的代码应该类似于:

#!perl -w
use SOAP::Lite;
print SOAP::Lite                                            
  uri('http://www.soaplite.com/Temperatures')
  proxy('http://webservices.uship.com')
  GetCategories('string')
  result;

uri()

中插入返回对象的URI

答案 1 :(得分:1)

我在进行SOAP调用时遇到了问题,因为我正在谈论的服务器是.NET,它显然与SOAP :: Lite存在通信问题: http://msdn.microsoft.com/en-us/library/ms995764.aspx#soapliteperl_topic3

即使您的服务器不是.NET,这是另一种拨打电话的方式(对我有用):

# proxy and uri strings should NOT have trialing slashes
my $_uri = 'http://youruri.com/whatever';
my $_proxy = 'http://yourproxy.com/something.asmx';
my $methodName = 'GetCategories';
my @params = (
        SOAP::Data->name( 'token'=>'string' ),
);

my $handle = SOAP::Lite
    ->uri( $_uri )
    ->proxy( $_proxy , timeout => 30, keep_alive => 1 )
    ->on_action( sub{ $_uri . "/" . $_[1] } );
my $method = SOAP::Data
    ->name( $methodName )
    ->attr( {xmlns => $_uri . "/"} );
my $rv = $handle->call( $method=>@params );
if( $rv->fault() ){
    print "SOAP Error ($methodName) :: " . $handle->transport()->status() . "\n\t" . $rv->faultcode() . ": " . $rv->faultstring();
} else {
    print $rv->result();
}

另外,查看您对其中一个答案的评论

  

codeuse SOAP :: Lite; print SOAP :: Lite - &gt;   uri('webservices.uship.com/uShipsvc.asmx?WSDL';) - &gt;   proxy('http:/webservices.uship.com') - &gt; GetCategories('myToken') - &gt;   结果

你可能有uri和代理向后。即,代理应该是您的.asmx(没有“?WSDL”)。如果你想要使用?WSDL,那么与使用uri +代理相比,它是一种完全不同的连接方法。请参阅:http://guide.soaplite.com/#access%20with%20service%20description%20%28wsdl%29

答案 2 :(得分:1)

您需要更正您的URI,http:/webservices.uship.com我得到500 No Host option provided at test-soap.pl line 7。将其更改为:

use SOAP::Lite; 
print SOAP::Lite
 -> uri('http://webservices.uship.com/uShipsvc.asmx?WSDL')
 -> proxy('http://webservices.uship.com')
 -> GetCategories('myToken')
 -> result;

答案 3 :(得分:0)

考虑使用SOAP::Trace跟踪SOAP来电的执行情况

您可以在lib / script中包含此use语句:

use SOAP::Lite +trace => [qw/ debug method fault /];

这可以帮助您调试SOAP电话。