Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't get Perl web service running using WSDL::Generator

Tags:

soap

wsdl

perl

I have been trying for two weeks to create a web service in Perl (with WSDL::Generator) and call it with a client written in Perl.

Now I try the examples provided with the library specializes in WSDL: Soap::Lite but I get an error that keeps appearing

404 file not found at c.PL at line 7.

Can you help me solve it?

Here is my code:

WorldFunctions.pm (C:\Perl\SOAP-Lite\WorldFunctions.pm) : the class

package WorldFunctions;
    sub new { bless {}, shift; }
    sub Hello { my ($s, $name) = @_;
            return 'Hello, ' . $name . "\n";
    }
    sub GoodBye { my ($s, $name) = @_;
            return 'Goodbye, ' . $name . "\n";
    }

a.pl (C:\Perl\SOAP-Lite\a.pl): to create the WSDL file of the class WorldFunctions.pm

#!/usr/bin/perl
use WSDL::Generator;
my $init = {
        'schema_namesp' => 'http://localhost/world/WorldFunctions.xsd',
        'services'      => 'WorldFunctions',
        'service_name'  => 'WorldFunctions',
        'target_namesp' => 'http://localhost/world',
        'documentation' => 'Simple Hello World SOAP Service.',
        'location'      => 'http://localhost/world'
};
my $w = WSDL::Generator->new($init);
WorldFunctions->Hello('Joe');
WorldFunctions->GoodBye('Joe');
print $w->get(WorldFunctions); # Returns the WSDL code for a specific class
open(TOTO,"<a.wsdl");
close(TOTO);
open(TOTO,">a.wsdl");
print TOTO $w->get(WorldFunctions);
close(TOTO);

c.pl (C:\Perl\SOAP-Lite\c.pl): perl client WSDL file

#!/usr/bin/perl 
use DBI();
use CGI;
use SOAP::Lite;
my $service = SOAP::Lite-> service('file:a.wsdl');   
print "test retour : |".$service-> Hello('Joe')."|";

Knowing that I use a local server (with WAMP server) and I copied into my directory WorldFunctions.pm localhost / world.

Here is the WSDL file:

<?xml version="1.0"?>
<definitions name="WorldFunctions" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" targetNamespace="http://localhost/world" xmlns:tns="http://localhost/world" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xsdl="http://localhost/world/WorldFunctions.xsd">
    <types>
        <xsd:schema targetNamespace="http://localhost/world/WorldFunctions.xsd">
            <xsd:element name="GoodByeRequest" type="xsd:string" />
            <xsd:element name="GoodByeResponse" type="xsd:string" />
            <xsd:element name="HelloRequest" type="xsd:string" />
            <xsd:element name="HelloResponse" type="xsd:string" />
        </xsd:schema>
    </types>
    <message name="GoodByeRequest">
        <part name="GoodByeRequestSoapMsg" element="xsdl:GoodByeRequest"/>
    </message>
    <message name="GoodByeResponse">
        <part name="GoodByeResponseSoapMsg" element="xsdl:GoodByeResponse"/>
    </message>
    <message name="HelloRequest">
        <part name="HelloRequestSoapMsg" element="xsdl:HelloRequest"/>
    </message>
    <message name="HelloResponse">
        <part name="HelloResponseSoapMsg" element="xsdl:HelloResponse"/>
    </message>
    <portType name="WorldFunctionsWorldFunctionsPortType">
        <operation name="GoodBye">
            <input message="tns:GoodByeRequest" />
            <output message="tns:GoodByeResponse" />
        </operation>
        <operation name="Hello">
            <input message="tns:HelloRequest" />
            <output message="tns:HelloResponse" />
        </operation>
    </portType>
    <binding name="WorldFunctionsWorldFunctionsBinding" type="tns:WorldFunctionsWorldFunctionsPortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
            <operation name="GoodBye">
                <soap:operation style="document" soapAction=""/>
                <input>
                    <soap:body use="literal"/>
                </input>
                <output>
                    <soap:body use="literal"/>
                </output>
            </operation>
            <operation name="Hello">
                <soap:operation style="document" soapAction=""/>
                <input>
                    <soap:body use="literal"/>
                </input>
                <output>
                    <soap:body use="literal"/>
                </output>
            </operation>
    </binding>
    <service name="WorldFunctions">
        <documentation>
            Simple Hello World SOAP Service.
        </documentation>
        <port name="WorldFunctionsWorldFunctionsPort" binding="tns:WorldFunctionsWorldFunctionsBinding">
            <soap:address location="http://localhost/world"/>
        </port>
    </service>
</definitions>
like image 347
Wael Avatar asked Apr 13 '12 09:04

Wael


1 Answers

It looks like you are not mapping http://localhost/world to the SOAP handler that can handle the request, hence you are getting a 404 for that URL.

You need to configure apache so there is something at that URL.

http://metacpan.org/pod/SOAP::WSDL::Server::Mod_Perl2

like image 148
abasterfield Avatar answered Oct 14 '22 19:10

abasterfield