加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

来自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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读