Возникли проблемы с доступом к переменной экземпляра объекта в коде сервера Perl SOAP - PullRequest
0 голосов
/ 30 июля 2011

Я работаю с примером клиент-серверного кода SOAP с использованием SOAP :: Transport :: HTTP: Daemon и SOAP :: Lite, и я заметил, что не могу получить доступ к переменной экземпляра, объявленной в методе new () объекта , Я уверен, что делаю что-то не так, но я не уверен, что (хотя прошло много лет с тех пор, как я был приличным программистом на Perl).

Вот мой сервер:

#! /usr/bin/env perl

use lib '/a/valid/directory/modules';

use SOAP::Transport::HTTP;

my $port = 9810;

my $dispatchers = {
  'urn:remote_call' => 'ExampleLibrary::MyExample'
};

my $daemon = SOAP::Transport::HTTP::Daemon
  -> new (LocalAddr => 'localhost', LocalPort => $port)
  -> dispatch_with($dispatchers)
  -> on_action(sub {return})
  ;

print "Connect to SOAP server at ", $daemon->url, "\n";
$daemon->handle;

Вот мой клиент (находится в каталоге, указанном в строке lib использования сервера, modules / ExampleLibrary / MyExample.pm):

package ExampleLibrary::MyExample;

use vars qw(@ISA);
@ISA = qw(Exporter SOAP::Server::Parameters);

use SOAP::Lite;

sub new {
  my($class, %args) = @_;
  my $self = bless({}, $class);
  $self->{somevar} = 'somedata';
  return $self;
}

sub remote_call {
  my $self = shift;
  my $envelope = pop;
  # Swap out return statements and the data is returned correctly
  # return SOAP::Data->type('xml' => 'foo');
  return SOAP::Data->type('xml' => "$self->{somevar}");
}

1;

Я уверен, что правильно нажимаю на клиента - я могу вставить статический текст в оператор return remote_call (закомментированный код) и увидеть его - но данные объекта указаны как $ self -> {somevar } никогда не отображается, с кавычками или без них. (Я использую SoapUI, чтобы поразить сервер.)

Кто-нибудь видит, чего мне не хватает? (О, я использую Perl v5.10.1 на Cygwin.)

Спасибо ...

Ответы [ 2 ]

1 голос
/ 10 августа 2011

Я сработал, немного подправив код по предложению @ RedGrittyBrick (или, возможно, это именно то, что он предложил, а я просто не понял).Спасибо также @ Axeman - вы возвращались несколько раз, чтобы попытаться помочь - я это очень ценю.Я поместил комментарии на сервере, чтобы указать две строки, которые исправили вещи.

Вот пересмотренный сервер:

#! /usr/bin/env perl

use lib '/a/valid/directory/modules';

use ExampleLibrary::MyExample;    # new!
use SOAP::Transport::HTTP;

my $port = 9810;

my $dispatchers = {
  # new--no quotes around the hash value
  'urn:remote_call' => ExampleLibrary::MyExample->new
};

my $daemon = SOAP::Transport::HTTP::Daemon
  -> new (LocalAddr => 'localhost', LocalPort => $port)
  -> dispatch_with($dispatchers)
  -> on_action(sub {return})
  ;

print "Connect to SOAP server at ", $daemon->url, "\n";
$daemon->handle;

Вот пересмотренный клиент.Действительно, единственными изменениями были добавление вызовов localtime (), чтобы я мог убедиться, что переменные, установленные в new (), остались неизменными в течение всего срока службы сервера.

package ExampleLibrary::MyExample;

use vars qw(@ISA);
@ISA = qw(Exporter SOAP::Server::Parameters);

use SOAP::Lite;

sub new {
  my($class, %args) = @_;
  my $self = bless({}, $class);
  $self->{'somevar'} = localtime();
  return $self;
}

sub remote_call {
  my $self = shift;
  my $envelope = pop;
  $now = localtime();
  return SOAP::Data->type('xml' => "now = $now, started at $self->{somevar}");
}

1;
1 голос
/ 01 августа 2011

В документах написано

  dispatch_with({
    URI => MODULE,        # 'http://www.soaplite.com/' => 'My::Class',
    SOAPAction => MODULE, # 'http://www.soaplite.com/method' => 'Another::Class',
    URI => object,        # 'http://www.soaplite.com/obj' => My::Class->new,
  })

У вас есть

my $dispatchers = {
  'urn:remote_call' => 'ExampleLibrary::MyExample'
};

может быть, это должно быть

my $dispatchers = {
  'urn:remote_call' => 'ExampleLibrary::MyExample->new'
};

В противном случае (я предполагаю, что) ваш метод может вызываться как статический метод, а не как метод экземпляра (экземпляр не был создан).

P.S. Отсутствие одинарных кавычек для строки создания объекта в документах озадачивает меня, так как предполагает, что один экземпляр используется для обработки всех запросов (и это кажется мне неправильным), но, возможно, это действительно то, что нужно для этой экспериментальной функции, и вам следует опускать одинарные кавычки тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...