2009-11-17 33 views
5

Perl aracılığıyla SOAP kullanarak bir web servisine erişmeye çalışıyorum ve hizmetlerin parametreler gerektiren işlevlerini çağıran sorunlar yaşıyorum. SABUN çağrı diyor dikte XSD, hizmet için Docs göre Perl ile parametrelerle arama işlevleri Perl ile

<xs:complexType name="getVersion"> 
<xs:sequence/> 
</xs:complexType> 
<xs:complexType name="getVersionResponse"> 
<xs:sequence> 
<xs:element minOccurs="0" name="return" type="xs:string"/> 
</xs:sequence> 
</xs:complexType> 
... 
<xs:complexType name="enumerateEntities"> 
<xs:sequence> 
<xs:element name="entityId" type="xs:int"/> 
<xs:element minOccurs="0" name="entityType" type="tns:entityType"/> 
</xs:sequence> 
</xs:complexType> 
<xs:complexType name="enumerateEntitiesResponse"> 
<xs:sequence> 
<xs:element maxOccurs="unbounded" minOccurs="0" name="return" nillable="true" type="xs:int"/> 
</xs:sequence> 
</xs:complexType> 

, iki fonksiyon için imzalar şunlardır: Ben gerektiren, birinci işlevi çağırmak mümkün duyuyorum

String getVersion() 
int[] enumerateEntities (int entityId, EntityType entityType) 

kullanarak hiçbir giriş parametreleri,:

#!/usr/bin/perl 

use SOAP::Lite; 
my $uri = 'http://wsdl.mydomain.com/'; 
my $service = SOAP::Lite 
-> uri($uri) 
-> on_action(sub { sprintf '"Call by on_action: %s"',shift}) 
-> proxy('http://192.168.1.100:8688/MyService/services/MyService.MyServicePort/'); 

$method = SOAP::Data->name("MyService")->attr({xmlns => $uri}); 
$getVersion = SOAP::Data->name("getVersion")->attr({xmlns=>$uri});#line 11 
my $theResult = $service->getVersion; 

unless ($theResult->fault){ print "Version: "; print $theResult->result;} 
else {print $theResult->faultstring;} 

... ama nafile olmuştur üzerindeki çizgiyi 11 değiştirerek parametrelerle bir işlevini çağırarak de (aşağıda) benim girişimi.

... 
@entityId = SOAP::Data->type('int')->name('entityId')->value(0); 
@entityType = SOAP::Data->type('EntityType')->name('entityType')->value(NODE); 
$enumerateEntities = SOAP::Data->name("enumerateEntities",@entityId,@entityType)->attr({xmlns=>$uri}); 
my $result2 = $service->enumerateEntities; 
print $result2->result; 

Hata yaptığım şey, bu, hizmetin işlevlerini parametrelerle çağırmamı engelliyor?


Düzenleme: İşte var SOAP :: WSDL

#!/usr/bin/perl 

use SOAP::WSDL; 
use Data::Dumper; 

my $service = SOAP::WSDL->new(
    wsdl => 'http://192.168.1.100:8688/MyService/services/MyService.MyServicePort?wsdl', 
    outputhash => 1 
); 
kullanılarak güncellenen örnek kod

cevap

5

Kullanım SOAP::WSDL hizmet wsdl tüketmek, düz perl verilere ve (isteğe bağlı) dan da mareşal sizin için yapılar. Tavsiye edilen modül. gibi

şey şu:

use SOAP::WSDL; 
use Data::Dumper; 

my $soap = SOAP::WSDL->new(
    wsdl => 'http://server/pathtoservice?WSDL', 
    outputhash => 1 
); 
my $res = $soap->call('method', { foo => 1, bar =>2 }); 
die $res->faultstring if $res->fault; 
print Dumper($res->result); 
+0

Bunu ancak baz uri olmadan ad ... alınamıyor", söylenene. Birini ayarlamak için> parse_uri < or > set_uri

+0

Benzer bir sorun yaşıyorum ve bu çözümü denedim ve parametreler sadece giden istekte bulunmuyor. Http://stackoverflow.com/questions/1765248 – aidan

+0

Yukarıdaki hizmetler, birçok hizmete karşı bana hizmet veriyor –

0
Sen WSDL ile ilgili sorunlar yaşıyorsanız SABUN :: Lite kullanarak deneyebilirsiniz

:

use SOAP::Lite qw(trace); 
:

her zaman kullanabilirsiniz unutmayın, Ne kadar yakın olduğunuzu görmek için gönderdiğiniz XML'yi tam olarak görmek için

.

my $soap = SOAP::Lite 
-> uri($uri) 
-> on_action(sub { sprintf '"Call by on_action: %s"',shift}) 
-> proxy('http://192.168.1.100:8688/MyService/services/MyService.MyServicePort/'); 

my $id = SOAP::Data->type('int')->name('entityId')->value(0); 
my $type= SOAP::Data->type('EntityType')->name('entityType')->value(NODE); 
$soap->enumerateEntities($id, $param); 
2

Sen wsdl istemci saplama kodu oluşturmak için wsdl2perl.pl kullanabilirsiniz:

Burada bu test için zaman var, ama yok başımın üstü kapalı en iyi benim tahminim. Bu işleri oldukça kolaylaştırıyor. wsdl2perl.pl SOAP :: WSDL'nin bir parçasıdır. İşte istemci kodunu oluşturduktan sonra örnek kod.

use MyInterfaces::SoapImplService::SoapPort; 

my $soap = MyInterfaces::SoapImplService::SoapPort->new(); 
#calling method createRecipient which takes 2 parameterss: 
#1. Complex type : recipient 
#2. Complex type : authentication 

my $response=$soap->createRecipient({ # MyTypes::createRecipient 
    recipient => { # MyTypes::Recipient 
     address => "test701\@test.com", # string 
     externalID => "test701\@test.com", # string 
     sourceDescription => "testing perl", # string 
     demographics => { # MyTypes::StringCollection 
     }, 
    }, 
    },, 
{ # MyTypes::authentication 
    username=>'testuser' , password=>'pass' 
    },, 
); 

#you can find example code of calling every function in your "MyInterfaces\SoapImplService\SoapPort.pm" file.