Как получить доступ к простому сервису SOAP в Perl - PullRequest
3 голосов
/ 20 сентября 2011

В настоящее время я работаю с perl и SOAP, используя SOAP :: Lite.

У меня есть простой SOAP-сервер, который работает нормально:

#!perl -w

  use SOAP::Transport::HTTP;

  use Demo;

  # don't want to die on 'Broken pipe' or Ctrl-C
  $SIG{PIPE} = $SIG{INT} = 'IGNORE';

  my $daemon = SOAP::Transport::HTTP::Daemon
    -> new (LocalPort => 801)
    -> dispatch_to('/home/soaplite/modules')
  ;

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

Он включает в себя небольшой класс Demo, который просто извлекает общую память системы:

Demo.py

#!/usr/bin/perl
use Sys::MemInfo qw(totalmem freemem totalswap);

print "total memory: ".(&totalmem / 1024)."\n";

У меня есть пример SOAP-клиента ниже, написанный на PERL, хотя я не уверен, как связаться с сервером (поскольку учебное пособие , которое я здесь приведу, идет по касательной, например, извлекает результат класс Demo.py от клиента:

  #!perl -w

  use SOAP::Lite;

  # Frontier http://www.userland.com/

  $s = SOAP::Lite 
    -> uri('/examples')
    -> on_action(sub { sprintf '"%s"', shift })
    -> proxy('http://superhonker.userland.com/')
  ;

  print $s->getStateName(SOAP::Data->name(statenum => 25))->result; 

Любая помощь будет принята с благодарностью :)

Ответы [ 2 ]

4 голосов
/ 24 сентября 2011

Для серверного скрипта метод dispatch_to принимает путь к загружаемому пакету и имя самого пакета. Если вы передадите третий параметр, он ограничит имена методов, видимых сервером. (например, 2 метода с именами memory и time, передача Demo::time в качестве 3-го параметра сделает memory невидимым для клиентского сервиса.)

Файл server.pl

my $daemon = SOAP::Transport::HTTP::Daemon
    -> new (LocalPort => 801)
    -> dispatch_to('/home/soaplite/modules', 'Demo')
;

Ваш демонстрационный пакет должен быть пакетом с методами, которые возвращают значения. Я не смог скомпилировать Sys :: MemInfo в моей системе, поэтому вместо этого я использовал localtime. Я не уверен, почему вы назвали свой пакет Demo.py, но пакеты Perl должны иметь расширение pm, иначе они не будут загружены должным образом.

Файл Demo.pm

#!/usr/bin/perl

package Demo;

#use Sys::MemInfo qw(totalmem freemem totalswap);

sub memory {
    #print "total memory: ".(&totalmem / 1024)."\n";
    return "Can't load Sys::MemInfo, sorry";
}

sub time {
    my $time = localtime;
    return $time;
}

1;

Для клиентского кода есть две важные части, которые должны быть правильно указаны для работы: proxy и uri. Прокси - это URL-адрес веб-службы мыла. Поскольку вы запускаете серверный скрипт как процесс-демон, ваш путь - это просто URL-адрес веб-сайта. У моего компьютера нет URL, поэтому я использовал http://localhost:801/. 801 - это порт, который вы указали выше. Если вы работали как сценарий cgi на другом веб-сервере (например, Apache), вам необходимо указать вызываемый сценарий cgi (например, http://localhost/cgi-bin/server.pl, изменив пакет в server.pl на SOAP::Transport::HTTP::CGI.

uri, вероятно, наиболее запутанно, но это пространство имен файлов xml, возвращаемых веб-службой. Включите +trace => 'debug', чтобы увидеть файл XML, возвращаемый веб-службой. URI должен быть просто именем сервера. Даже если вы переключаете порты или используете способ отправки cgi, этот URI остается прежним.

Файл test.pl

#!perl -w

use SOAP::Lite +trace => 'debug';

# Frontier http://www.userland.com/

$s = SOAP::Lite->new(proxy => 'http://superhonker.userland.com:801/',
        uri => 'http://superhonker.userland.com/');
               #might be http://www.userland.com/
               #but I could not test sub-domains

print $s->time()->result;
3 голосов
/ 21 сентября 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...