2009-11-17 54 views
5

Tôi đang cố truy cập dịch vụ web bằng SOAP thông qua Perl và đang gặp sự cố khi gọi các chức năng của dịch vụ yêu cầu tham số. XSD rằng mệnh lệnh cuộc gọi SOAP nói,Chức năng gọi với các tham số sử dụng SOAP với Perl

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

Theo các tài liệu cho các dịch vụ, chữ ký cho hai chức năng là:

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

tôi có thể gọi hàm đầu tiên, đòi hỏi không có tham số đầu vào, sử dụng:

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

... nhưng nỗ lực của tôi (bên dưới) khi gọi hàm có thông số bằng cách thay đổi dòng 11 là vô ích.

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

Tôi đang làm gì sai khiến tôi không thể gọi các chức năng của dịch vụ có thông số?


Edit: Dưới đây là các mẫu mã được cập nhật bằng cách sử dụng 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 
); 

Trả lời

5

Sử dụng SOAP::WSDL để tiêu thụ wsdl dịch vụ, nó cũng nguyên soái từ và (tùy chọn) để dữ liệu perl đồng bằng cấu trúc cho bạn. Mô-đun được khuyến nghị cao.

Something như sau:

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

Tôi làm điều này nhưng tôi nói, "Không thể nhập namespace ... mà không uri cơ sở. Sử dụng> parse_uri < or > set_uri <để thiết lập một. Tôi có uri từ ví dụ của tôi ở trên. Làm thế nào để cài đặt nó sử dụng SOAP :: WSDL? –

+0

Tôi đang gặp vấn đề tương tự, và tôi đã thử giải pháp này, và các tham số không làm cho nó thông qua yêu cầu gửi đi. Http://stackoverflow.com/questions/1765248 – aidan

+0

Bạn có thể cung cấp dịch vụ và các url WSDL để thử nghiệm? Các công trình trên cho tôi đối với nhiều dịch vụ. –

0

Bạn có thể thử sử dụng SOAP :: Lite nếu bạn đang gặp vấn đề với WSDL:

nhớ, bạn luôn có thể sử dụng:

use SOAP::Lite qw(trace); 

để xem chính xác XML bạn đang gửi để xem bạn thân thiết đến mức nào.

Tôi không có thời gian để kiểm tra điều này ra, nhưng đây là đoán tốt nhất của tôi ra khỏi đỉnh đầu của tôi:

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

Bạn có thể sử dụng wsdl2perl.pl để tạo mã khách hàng còn sơ khai từ wsdl. Điều này làm cho mọi thứ trở nên dễ dàng. wsdl2perl.pl là một phần của SOAP :: WSDL. Đây là mã mẫu sau khi bạn đã tạo ra sơ khai khách hàng.

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. 
Các vấn đề liên quan