【问题标题】:Can't find namespace for method(16:method)-while client using SOAP::Lite客户端使用 SOAP::Lite 时找不到方法 (16:method) 的命名空间
【发布时间】:2011-05-05 01:32:54
【问题描述】:

当我运行我的 perl 脚本(版本:5.6.1)时,出现以下错误: 找不到方法的命名空间(16:方法) 我的代码是:

   my $ws_url = '$url';
   my $ws_uri = '$uri';
   my $ws_xmlns = '$xmlns';     
   my $soap = SOAP::Lite
        -> uri($ws_uri)
        -> on_action( sub { join '/s/', $ws_uri, $_[1] } )
        -> proxy($ws_url);

    my $method = SOAP::Data->name('Add')
        ->attr({xmlns => $ws_xmlns});

    my @params = ( SOAP::Data->name(addParam => $myParam));                        

    $response = $soap->call($method => @params);

然后我阅读了链接中的文档: http://docs.activestate.com/activeperl/5.8/lib/SOAP/Lite.html,上面写着:

请注意,尽管您使用此方法拥有更多控制权,但您应该 明确指定方法的命名空间属性,即使您制作了 uri() 早点打电话。所以,如果你必须在方法元素上有命名空间,而不是: 打印 SOAP::Lite -> 新的(....) -> uri('mynamespace') # 将被忽略 -> 调用(SOAP::Data->name('method') => @parameters) -> 结果; 做 打印 SOAP::Lite -> 新的(....) -> 调用(SOAP::Data->name('method')->attr({xmlns => 'mynamespace'}) => @参数) -> 结果; ………… ………… 此外,如果您尝试使用前缀名称调用它,它将成为致命错误: 打印 SOAP::Lite -> 新的(....) -> uri('mynamespace') # 将被忽略 -> 调用(SOAP::Data->name('a:method') => @parameters) -> 结果; 给你: 找不到方法的命名空间(a:method) 因为没有任何东西与前缀“a”相关联。

所以,我尝试将代码更改为:

        my $soap = SOAP::Lite
        -> on_action( sub { join '/s/', $ws_uri, $_[1] } )
        -> proxy($ws_url);

    my @params = ( SOAP::Data->name(addParam => $myParam));                        

    my $response = $soap->call(SOAP::Data->name('Add')->attr({xmlns => $ws_xmlns})  => @params)  
    ->result;    

它仍然没有工作.. 有什么建议吗?

先谢谢了!

【问题讨论】:

    标签: web-services perl client perl-module


    【解决方案1】:

    SOAP::Lite 使用 Scalar::Util。 Scalar::Util 中有 XS(即编译的 C,非纯 Perl)代码。

    您运行的 Perl 版本是 5.6.1。

    您提供的文档链接指向 Perl 5.8.0 版的 ActiveState 库。我将假设您安装的 SOAP::Lite 版本是为 5.8.0 编译的,因为那是您引用的文档版本。

    Perl 版本 5.8.0 与 Perl 5.6.1 的二进制不兼容。为 5.6.1 编译的包含 XS 的模块将不会在 5.8.0 下运行。为 5.8.0 编译的包含 XS 代码的模块将不会在 5.6.1 下运行。在您的情况下,包含 XS 代码的不是模块 SOAP::Lite,而是它的依赖项之一:Scalar::Util。

    当您从 5.8.0 的 ActiveState 存储库安装 SOAP::Lite 时,PPM 更新了所有模块的依赖项,包括 Scalar::Util。这样做时,它安装了一个与 Perl 5.6.1 二进制不兼容的 Scalar::Util 版本。

    在没有更好的理论的情况下,您遇到的错误足以支持这一理论。似乎摆脱混乱的最简单方法是升级 Perl 以及您安装的模块,并希望它不会破坏其他东西。 ;)

    【讨论】:

    • 嗨,不是这样的。确实,该文档不适用于合适的 perl 版本,但是 perl 安装了 5.6.1 版本的模块,还有什么建议吗?提前谢谢!
    • 大声笑,好的。我花了大约一个小时查看 SOAP::Lite 的源代码及其依赖项,这就是我根据原帖中提到的版本不匹配这一事实得出的结论。
    • SOAP::Lite 有很多按需创建的代码和包名。这有助于它处理 XML 是一个自描述实体的事实。在没有看到提供给它的 XML 的情况下,我想知道 XML 是否可能导致它尝试自动创建对 Perl 不合法的包名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    相关资源
    最近更新 更多