Для серверного скрипта метод 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;