В этой статье я покажу, как реализовать простой SOAP-сервис, используя Plack.
SOAP – это протокол для вызова удаленных процедур (RPC) с сериализацией в xml. Статья в Википедии.
Впрочем, если вы не знаете, что такое SOAP – и не надо, пропустите эту статью и живите счастливо дальше, ничего не потеряете.
Однако если вам приходится писать или поддерживать SOAP-сервис на Perl (еще точноее, с использованием SOAP::Lite) – читайте дальше, как совместить его с современными PSGI-технологиями.
Если ваш сервис работает не с SOAP::Lite – читайте документацию по вашей SOAP-библиотеке, скорее всего, она тоже предоставляет Plack-интерфейс.
Предварительно требуется пакет с CPAN: SOAP::Transport::HTTP::Plack. Ну и SOAP::Lite, естественно, но он у вас скорее всего уже есть.
mysoap.psgi:
use strict;
use warnings;
use MySOAPService;
use SOAP::Transport::HTTP::Plack;
use Plack::Request;
use SOAP::Lite;
use utf8;
my $soap_server;
my $app = sub {
my $env = shift;
my $r = Plack::Request->new($env);
$soap_server ||= SOAP::Transport::HTTP::Plack
-> serializer(SOAP::Serializer->new())
-> deserializer(SOAP::Deserializer->new())
-> dispatch_to('MySOAPService');
my $response = $soap_server->handler($r);
return $response;
};
$app;
MySOAPService.pm (где и живет вся логика сервиса):
package MySOAPService;
use strict;
use warnings;
sub echo
{
shift;
return \@_;
}
1;
> plackup --port 8080 mysoap.psgi
Скрипт-клиент client.pl:
#!perl -w
use strict;
use warnings;
use SOAP::Lite;
use YAML;
use utf8;
my $echo = SOAP::Lite
-> uri('MySOAPService')
-> proxy('http://127.0.0.1:8080/')
-> echo({ a => 1, b => 2, c => [ 3, "IV", "Пять"] })
-> result;
print YAML::Dump($echo);
Запускаем:
> ./client.pl
---
- a: 1
b: 2
c:
- 3
- IV
- Пять