Как получить доступ к веб-сервисам SourceGear с помощью SOAP::Lite?
По какой-то причине SourceGear предоставляет недокументированный веб-сервис по своим установкам. Они фактически просят разработчиков использовать API вместо этого, потому что веб-сервис немного грязный, но в моем случае это проблема, потому что я не могу использовать этот API в среде Perl, поэтому их решение для моего конкретного случая - использовать веб-сервис.
Это не должно быть проблемой. Используя SOAP::Lite, я ранее подключался к нескольким веб-сервисам одним и тем же способом. Но отсутствие документации - главный хаос, если вы не знаете, где можно сделать вызовы SOAP. У меня есть только XML для расшифровки, где и как делать эти вызовы. Было бы здорово, если бы настоящий гений SOAP помог мне в этом.
Это пример входа в систему и ожидаемого ответа:
Запрос
POST /fortress/dragnetwebservice.asmx HTTP/1.1
Host: velecloudserver
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.sourcegear.com/schemas/dragnet/LoginPlainText"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<LoginPlainText xmlns="http://www.sourcegear.com/schemas/dragnet">
<strLogin>string</strLogin>
<strPassword>string</strPassword>
</LoginPlainText>
</soap:Body>
</soap:Envelope>
отклик
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<LoginPlainTextResponse xmlns="http://www.sourcegear.com/schemas/dragnet">
<LoginPlainTextResult>int</LoginPlainTextResult>
<strAuthTicket>string</strAuthTicket>
</LoginPlainTextResponse>
</soap:Body>
</soap:Envelope>
Я ищу способ как-нибудь собрать это. Это мой пример Perl:
my $soap = SOAP::Lite -> uri ('http://velecloudserver/fortress/dragnetwebservice.asmx') -> proxy('http://velecloudserver/fortress/dragnetwebservice.asmx/LoginPlainText');
my $som = $soap->call('LoginPlainText', SOAP::Data->name('LoginPlainText')->value(
\SOAP::Data->value([
SOAP::Data->name('strLogin')->value( 'admin' ),
SOAP::Data->name('strPassword')->value('Adm1234'),
]))
);
Любой совет будет оценен.
1 ответ
Начните с указания wget/curl/lwp/etc. по адресу http://velecloudserver/fortress/dragnetwebservice.asmx?WSDL и посмотрите, вернете ли вы файл WSDL.
Если вы это сделаете, то сравните его с четырьмя типами, перечисленными в POD SOAP::Lite. Ваш пример запроса выглядит как форма документа / документа, так что вы можете написать что-то вроде этого:
use SOAP::Lite;
my $soap = SOAP::Lite->new( file => 'http://velecloudserver/fortress/dragnetwebservice.asmx?WSDL');
$soap->on_action( sub { "urn:dragnetservice#LoginPlainText" });
$soap->autotype(0);
$soap->default_ns('urn:LoginPlainText');
my $som = $soap->call("LoginPlainText",
SOAP::Data->name('strLogin')->value( 'admin' ),
SOAP::Data->name('strPassword')->value('Adm1234'),
);
die $som->fault->{ faultstring } if ($som->fault);
print $som->result, "\n";
Если вы не получите WSDL, я бы попробовал заменить вызов конструктора на:
my $soap = SOAP::Lite->new( proxy => 'http://velecloudserver/fortress/dragnetwebservice.asmx');
В прошлый раз, когда я работал с SOAP::Lite, я написал короткую программу, похожую на ту, что описана выше, и запустил ее под отладчиком. Перед тем, как выполнить строку $soap->call(), я заглянул в кишки объекта $ soap и посмотрел на полезную нагрузку запроса, чтобы увидеть, соответствует ли XML некоторому рабочему XML, который у меня был, с помощью Java-клиента soapUI.org.
Мне пришлось пару раз прочитать POD, и я покопался в источнике, чтобы понять, как некоторые из методов, таких как default_ns(), влияют на сгенерированный XML. После того, как я это сделал, все стало намного понятнее.
Примечание: SOAP::Lite любит die(), когда он терпит неудачу. Оберните ваши звонки в eval{} для производственного использования.