我需要使用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(错误的主机名'')
答案 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()
答案 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
电话。