Reputation: 945
I am trying to create SOAP service using SOAP::Lite, but it does not return the value. It gives Error Use of uninitialized value $result in print at soap_client.pl line 6.
<VirtualHost 192.168.1.187:80>
ServerName perl.qlc.net
ServerAlias www.perl.qlc.net
DocumentRoot /web/perl.qlc.net/htdocs
ErrorLog /var/log/httpd/perl.qlc.net_error_log
TransferLog /var/log/httpd/perl.qlc.net_access_log
<Directory "/web/perl.qlc.net/htdocs">
<FilesMatch "\.mhtml$|\.pl$|\.html$">
Options +ExecCGI
AddHandler cgi-script .cgi .pl .html
SetHandler perl-script
PerlHandler ModPerl::Registry
PerlSendHeader On
</FilesMatch>
</Directory>
DirectoryIndex index.phtml index.htm index.html index.php3 index.php
</VirtualHost>
Installed perl modules:
MIME::Parser
SOAP::Lite
Apache module:
mod_perl
Soap server: math.pl
#!/usr/bin/perl -w
use strict;
#use warnings;
use SOAP::Lite;
use SOAP::Transport::HTTP;
print "Content-type:text/xml\r\n\r\n";
#I have added above line because apache was throwing 500 error.
my $soap = SOAP::Transport::HTTP::CGI->new(
dispatch_to => 'Arithmetic'
);
$soap->handle();
package Arithmetic;
sub add {
return $_[1] + $_[2];
}
1;
Soap client: soap_client.pl
#!/usr/bin/perl -w
#use SOAP::Lite +trace =>'debug';
use SOAP::Lite;
my $result = 0;
my $client = SOAP::Lite->service("http://perl.qlc.net/math.wsdl");
print $result = $client->add(10, 20);
Wsdl file: math.wsdl
<?xml version="1.0"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://perl.qlc.net/math.wsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="HelloService" targetNamespace="http://perl.qlc.net/math.wsdl">
<message name="addRequest">
<part name="operand1" type="xsd:float" />
<part name="operand2" type="xsd:float" />
</message>
<message name="addResponse">
<part name="response" type="xsd:float" />
</message>
<portType name="Hello_PortType">
<operation name="add">
<input message="tns:addRequest"/>
<output message="tns:addResponse"/>
</operation>
</portType>
<binding name="Hello_Binding" type="tns:Hello_PortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="add">
<soap:operation soapAction="add"/>
<input>
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:examples:helloservice" use="encoded"/>
</input>
<output>
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:examples:helloservice" use="encoded"/>
</output>
</operation>
</binding>
<service name="Hello_Service">
<documentation>WSDL File for HelloService</documentation>
<port binding="tns:Hello_Binding" name="Hello_Port">
<soap:address location="http://perl.qlc.net/math.pl"/>
</port>
</service>
</definitions>
When I run soap_client.pl it gives me following error: Use of uninitialized value $result in print at soap_client.pl line 6. I have been trying this for 2 day, not getting any clue where i am doing wrong.
Upvotes: 2
Views: 6106
Reputation: 945
The Problem has been solved by modifying math.wsdl Modified math.wsdl
<?xml version="1.0"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="urn:Arithmetic" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="HelloService" targetNamespace="urn:Arithmetic" xmlns:y="urn:Arithmetic">
<message name="addRequest">
<part name="operand1" type="xsd:float" />
<part name="operand2" type="xsd:float" />
</message>
<message name="addResponse">
<part name="response" type="xsd:float" />
</message>
<portType name="Hello_PortType">
<operation name="add">
<input message="tns:addRequest"/>
<output message="tns:addResponse"/>
</operation>
</portType>
<binding name="Hello_Binding" type="tns:Hello_PortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="add">
<soap:operation soapAction="urn:Arithmetic#add"/>
<input>
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Arithmetic" use="encoded"/>
</input>
<output>
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Arithmetic" use="encoded"/>
</output>
</operation>
</binding>
<service name="Hello_Service">
<documentation>WSDL File for HelloService</documentation>
<port binding="tns:Hello_Binding" name="Hello_Port">
<soap:address location="http://perl.qlc.net/math.pl"/>
</port>
</service>
</definitions>
Upvotes: 3
Reputation:
You need to include the result method to get the result:
$client->add(10, 20)->result;
In addition, you should probably add some error handling to check if the command succeeded before you use the result:
my $added = $client->add(10,20);
unless (defined $added)
{
die "Failed add: $!";
}
$result = $added->result;
Also, are you using a .net server by any chance? The Soap::Lite
documentation makes some specific recommendations in that case, and recommends against using the above format.
Upvotes: 1