Can't get Perl web service running using WSDL::Generator
perl, soap, wsdl
Solution
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
Problem
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> ```