Не удается найти пространство имен для метода (16: метод) в то время как клиент использует SOAP :: Lite - PullRequest
0 голосов
/ 05 мая 2011

Когда я запускаю свой 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,, которая гласит:

Be warned, that though you have more control using this method, you should
specify namespace attribute for method explicitely, even if you made uri()
call earlier. So, if you have to have namespace on method element, instead of:

  print SOAP::Lite
    -> new(....)
    -> uri('mynamespace') # will be ignored
    -> call(SOAP::Data->name('method') => @parameters)
    -> result;

do

  print SOAP::Lite
    -> new(....)
    -> call(SOAP::Data->name('method')->attr({xmlns => 'mynamespace'})
            => @parameters)
    -> result;

……….
……….
Moreover, it'll become fatal error if you try to call it with prefixed name:

  print SOAP::Lite
    -> new(....)
    -> uri('mynamespace') # will be ignored
    -> call(SOAP::Data->name('a:method') => @parameters)
    -> result;

gives you:

  Can't find namespace for method (a:method)

because nothing is associated with prefix '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;    

, и он все еще не работал .. любой совет?

спасибо вперед!

1 Ответ

1 голос
/ 05 мая 2011

SOAP :: Lite использует Scalar :: Util. Scalar :: Util содержит код XS (т.е. скомпилированный C, не на чистом Perl).

Версия Perl, с которой вы работаете, - 5.6.1.

Указанная вами ссылка на документацию указывает на библиотеку ActiveState для Perl версии 5.8.0. Я собираюсь предположить, что установленная вами версия 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. В вашем случае это не модуль SOAP :: Lite, который содержит код XS, а одна из его зависимостей: Scalar :: Util.

Когда вы установили SOAP :: Lite из репозитория ActiveState для 5.8.0, PPM обновил все зависимости модуля, включая Scalar :: Util. При этом была установлена ​​версия Scalar :: Util, которая не совместима с Perl 5.6.1.

.

Ошибка, с которой вы столкнулись, достаточно сомнительна, чтобы поддержать эту теорию, если нет лучшей. Похоже, что самым простым выходом из сложившейся ситуации было бы обновить Perl, а также ваши установленные модули, и надеяться, что это не сломает что-то еще. ;)

...