SOAP запрос из Perl

Материал из BiTel WiKi

Перейти к: навигация, поиск

Внимание! Данное решение/метод/статья относится к версии 6.1 и для других версий может быть неактуальна! Вам нужно самостоятельно поправить решение под свои нужды или воспользоваться помощью на форуме. Будем признательны, если внизу страницы или отдельной статьёй вы разместите исправленное решение для другой версии или подсказки что надо исправить.

Ниже показан пример запроса с использованием протокола SOAP, на языке Perl. Для того что легче было вникнуть в код советую открыть две странички http://ваш_сервер:8080/bgbilling/executer/ru.bitel.bgbilling.kernel.contract.balance/PaymentService?wsdl где можно ознакомиться с описанием методов и требуемых при обращении к ним аргументов. Там же будет указано:

<xsd:schema>
<xsd:import namespace="http://common.bitel.ru" schemaLocation="http://ваш_сервер:8080/bgbilling/executer/ru.bitel.bgbilling.kernel.contract.balance/PaymentService?xsd=1"/>
</xsd:schema>
<xsd:schema>
<xsd:import namespace="http://common.balance.contract.kernel.bgbilling.bitel.ru/" schemaLocation="http://ваш_сервер:8080/bgbilling/executer/ru.bitel.bgbilling.kernel.contract.balance/PaymentService?xsd=2"/>
</xsd:schema>

где указанны ссылки на описание используемых в интерфейсе PaymentService типов данных.

Код, который заносит платеж суммой 10, контракту с id=1, датой 15.11.2015:

#!/usr/bin/perl
 
use CGI qw(:standard);
use DBI;
use SOAP::Lite;
#use SOAP::Lite +trace => 'all';  используйте для отладки, отлично помогает
use MIME::Base64;
 
$cid = 1;
$dt = "2015-11-15";
$sum = "10";
#т.к. в данном примере рассматривается случай с зачислением платежа, используем соответствующую ссылку
$wsdl = "http://192.168.0.1:8080/bgbilling/executer/ru.bitel.bgbilling.kernel.contract.balance/PaymentService?wsdl";
#comment - это свойство элемента payment, создаем его и заносим значение 
@comment = ("<comment>$comment</comment>");
$authoriz = 'Basic '.encode_base64('login:password'); #Формируем строку авторизации 
#если надо в xml-запросах указать SOAP-ENV вместо просто SOAP. Работает и так  и так 
#$SOAP::Constants::PREFIX_ENV = 'SOAP-ENV';
#Аналогично
#$SOAP::Constants::PREFIX_ENC = "SOAP-ENC";
$client = SOAP::Lite->new(service=>$wsdl);
$client->proxy($wsdl);
#определяем пространство где искать типы элементов
$client->ns("http://common.balance.contract.kernel.bgbilling.bitel.ru/","ns1"); 
#если нужен вывод полученного сообщения от сервера, для отладки
$client->outputxml('true');
$client->transport->http_request->headers->push_header('Authorization' => $authoriz );
$soap = $client->service($wsdl.'?wsdl');
#создаем объект payment 
my $pm = SOAP::Data->new(name=>"payment"); 
# указываем что этот объект будет иметь тип payment из текущего пространства (указали выше)
$pm->type("ts:payment");
# определяем атрибуты payment'а
$pm->attr({ id => "-1", contractId=>"$cid", date=>"$dt", sum=>"$sum", summa=>"$sum", typeId=>"3", userId=>"0"});
#добавляем payment'у свойство из массива comment, определенного выше
$pm->value(@comment);
#ну и вызываем процедуру paymentUpdate, передаем на вход переменную содержащую информацию о платеже. Ответ будет выведен на экран
print $client->call('paymentUpdate',$pm);

Атрибуты и свойства объекта payment указаны, как написано выше по ссылке http://ваш_сервер:8080/bgbilling/executer/ru.bitel.bgbilling.kernel.contract.balance/PaymentService?xsd=2 Более подробней с модулем SOAP для Perl, можно ознакомится по ссылке http://search.cpan.org/~phred/SOAP-Lite-1.19/lib/SOAP/Lite.pm

Личные инструменты