无法使用WSDL :: Generator运行Perl Web服务

时间:2012-04-13 09:10:29

标签: perl soap wsdl

我已经尝试用两周时间在Perl中创建一个Web服务(使用WSDL::Generator)并使用Perl编写的客户端调用它。

现在我尝试一下专门用于WSDL的库提供的示例:Soap::Lite 但我得到一个不断出现的错误

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

你能帮我解决一下吗?

这是我的代码:

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

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):创建WorldFunctions.pm类的WSDL文件

#!/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客户端WSDL文件

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

知道我使用本地服务器(使用WAMP服务器)并将其复制到我的目录WorldFunctions.pm localhost / world。

这是WSDL文件:

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

1 个答案:

答案 0 :(得分:3)

看起来您没有将http://localhost/world映射到可以处理请求的SOAP处理程序,因此您获得了该URL的404。

您需要配置apache,以便该URL存在某些内容。

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