2009-11-17 7 views
5

के साथ SOAP का उपयोग करके पैरामीटर के साथ कॉलिंग फ़ंक्शंस मैं पर्ल के माध्यम से SOAP का उपयोग करके एक वेब सेवा तक पहुंचने का प्रयास कर रहा हूं और मुझे सेवा के कार्यों को कॉल करने में समस्याएं हैं जिनके लिए पैरामीटर की आवश्यकता है। XSD कि तय सोप कॉल कहते हैं,पर्ल

<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> 

सेवा के लिये दस्तावेज के अनुसार, दो कार्यों के लिए हस्ताक्षर कर रहे हैं:

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

मैं पहली बार समारोह कॉल करने के लिए है, जो की आवश्यकता है में सक्षम हूँ कोई इनपुट पैरामीटर का उपयोग करते हुए:

#!/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;} 

... लेकिन मेरे प्रयास व्यर्थ गया है पर लाइन 11 बदलकर मानकों के साथ एक समारोह बुला पर (नीचे)।

... 
@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; 

मैं गलत क्या कर रहा हूं जो मुझे पैरामीटर के साथ सेवा के कार्यों को कॉल करने से रोक रहा है?


संपादित करें: यहाँ सोप :: डबल्यूएसडीएल

#!/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 
); 
का उपयोग कर के साथ अद्यतन नमूना कोड

उत्तर

5

उपयोग SOAP::WSDL सेवा wsdl उपभोग करने के लिए, यह भी सादे पर्ल आंकड़ों के और (वैकल्पिक) से मार्शलों आपके लिए संरचनाएं अत्यधिक अनुशंसित मॉड्यूल।

कुछ की तरह है:

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

मैं यह कर, लेकिन बताया गया है, "नाम स्थान ... आयात नहीं कर सकते आधार uri बिना। एक सेट करने के लिए> parse_uri < or > set_uri <का प्रयोग करें। मैं ऊपर मेरी उदाहरण से uri की है। मैं कैसे सोप का उपयोग कर यह सेट करना :: डब्ल्यूएसडीएल? –

+0

मुझे एक ही समस्या है, और मैंने इस समाधान की कोशिश की है, और पैरामीटर इसे आउटगोइंग अनुरोध के माध्यम से नहीं बनाते हैं। Http://stackoverflow.com/questions/1765248 – aidan

+0

क्या आप परीक्षण के लिए सेवा और डब्ल्यूएसडीएल यूआरएल की आपूर्ति करें? उपरोक्त कई सेवाओं के खिलाफ मेरे लिए काम करता है। –

0

आप साबुन :: लाइट का उपयोग कर यदि आप WSDL के साथ समस्या हो रही है कोशिश कर सकते हैं:

याद है, तुम हमेशा उपयोग कर सकते हैं:

use SOAP::Lite qw(trace); 

आप जो सटीक एक्सएमएल भेज रहे हैं उसे देखने के लिए आप कितने करीब हैं।

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

आप wsdl2perl.pl का उपयोग wsdl से ग्राहक ठूंठ कोड उत्पन्न करने के लिए कर सकते हैं:

मैं इस बाहर का परीक्षण करने के लिए समय नहीं है, लेकिन यहाँ मेरे सिर के ऊपर से मेरे सबसे अच्छे अनुमान है। यह चीजों को बहुत आसान बनाता है। wsdl2perl.pl SOAP :: WSDL का हिस्सा है। क्लाइंट स्टब उत्पन्न करने के बाद नमूना कोड यहां दिया गया है।

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.