Perl: SOAP-сервис на Plack

18 Dec 2013


...

В этой статье я покажу, как реализовать простой SOAP-сервис, используя Plack.

Что такое SOAP

SOAP – это протокол для вызова удаленных процедур (RPC) с сериализацией в xml. Статья в Википедии.

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

Однако если вам приходится писать или поддерживать SOAP-сервис на Perl (еще точноее, с использованием SOAP::Lite) – читайте дальше, как совместить его с современными PSGI-технологиями.

Если ваш сервис работает не с SOAP::Lite – читайте документацию по вашей SOAP-библиотеке, скорее всего, она тоже предоставляет Plack-интерфейс.

Предварительно требуется

Предварительно требуется пакет с CPAN: SOAP::Transport::HTTP::Plack. Ну и SOAP::Lite, естественно, но он у вас скорее всего уже есть.

Простейший SOAP-сервер

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
    - Пять

Ну вот и все. Удачи!

Дополнительно читаем