来自tarball的perl SOAP WSDL的完整工作HelloWorld示例
发布时间:2020-12-15 21:45:39 所属栏目:大数据 来源:网络整理
导读:我想知道是否有人可以提供带有WSDL文件的SOAP 1.2服务器(无CGI)SOAP 1.2客户端的完整工作示例. 我在1周后尝试的任何事情都失败了. 我最后一次尝试使用SOAP :: Transport :: HTTP :: Daemon模块给我: SOAP::Serializer::envelope: Client Denied access to m
我想知道是否有人可以提供带有WSDL文件的SOAP 1.2服务器(无CGI)SOAP 1.2客户端的完整工作示例.
我在1周后尝试的任何事情都失败了. 我最后一次尝试使用SOAP :: Transport :: HTTP :: Daemon模块给我: SOAP::Serializer::envelope: Client Denied access to method (AnalyzeDocument) in class (main) at /usr/share/perl5/site_perl/SOAP/Lite.pm line 2806 我有大量的Firefox标签打开,但没有一个解决方案在2012年工作. /usr/share/perl5/site_perl/SOAP/Lite.pm相关部分是 # TODO - sort this mess out: # The task is to test whether the class in question has already been loaded. # # SOAP::Lite 0.60: # unless (defined %{"${class}::"}) { # Patch to SOAP::Lite 0.60: # The following patch does not work for packages defined within a BEGIN block # unless (exists($INC{join '/',split /::/,$class.'.pm'})) { # Combination of 0.60 and patch did not work reliably,either. # # Now we do the following: Check whether the class is main (always loaded) # or the class implements the method in question # or the package exists as file in %INC. # # This is still sort of a hack - but I don't know anything better # If you have some idea,please help me out... # unless (($class eq 'main') || $class->can($method_name) || exists($INC{join '/',$class . '.pm'})) { # allow all for static and only specified path for dynamic bindings local @INC = (($static ? @INC : ()),grep {!ref && m![/.]!} $self->dispatch_to()); eval 'local $^W; ' . "require $class"; die "Failed to access class ($class): $@" if $@; $self->dispatched($class) unless $static; } die "Denied access to method ($method_name) in class ($class)" unless $static || grep {/^$class$/} $self->dispatched; return ($class,$method_uri,$method_name); } 解决方法
解
这个解决方案在Debian上使用Apache服务器mod_perl(或派生) vi /etc/apache2/sites-available/default 添加块: <Location /SOAP/> SetHandler perl-script PerlHandler Apache::SOAP PerlSetVar dispatch_to '/usr/share/perl5/' </Location /usr/share/perl5/HelloWorld.pm模块文件: package HelloWorld; use strict; use warnings; sub sayHello { return "Hello @_n"; } 1; SOAP客户端: use SOAP::Lite +trace; use strict; use warnings; my $client = SOAP::Lite->new; my $ua = $client->schema->useragent; $ua->agent("Fubar! 0.1"); my $response = $client # WSDL url ->service("http://example.com/HelloWorld.xml") // the below exposed wsdl # method from SOAP server Module ->sayHello("foo","bar"); print $response; WSDL文件: <definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="urn:HelloWorld" targetNamespace="urn:HelloWorld" xmlns="http://schemas.xmlsoap.org/wsdl/"> <types> <s:schema targetNamespace="urn:HelloWorld"> </s:schema> </types> <message name="sayHello"> <part name="name" type="s:string" /> <part name="givenName" type="s:string" /> </message> <message name="sayHelloResponse"> <part name="sayHelloResult" type="s:string" /> </message> <portType name="Service1Soap"> <operation name="sayHello"> <input message="s0:sayHello" /> <output message="s0:sayHelloResponse" /> </operation> </portType> <binding name="Service1Soap" type="s0:Service1Soap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc" /> <operation name="sayHello"> <soap:operation soapAction="urn:HelloWorld#sayHello"/> <input> <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </input> <output> <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </output> </operation> </binding> <service name="HelloWorld"> <port name="HelloWorldSoap" binding="s0:Service1Soap"> <soap:address location="http://localhost:80/SOAP/" /> </port> </service> </definitions> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |