Как получить доступ к веб-сервисам SourceGear с помощью SOAP :: Lite? - PullRequest
1 голос
/ 06 января 2011

По какой-то причине SourceGear предоставляет недокументированную веб-службу для своих установок. Они фактически просят разработчиков использовать API вместо этого, потому что Web-сервис немного грязный, но в моем случае это проблема, потому что я не могу использовать этот API в среде Perl, поэтому их решение для моего конкретного случая - использовать Web-сервис.

Это не должно быть проблемой. Используя 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 Ответ

0 голосов
/ 11 января 2011

Начните с указания wget / curl / lwp / etc.на http://velecloudserver/fortress/dragnetwebservice.asmx?WSDL и посмотрите, вернете ли вы файл WSDL.

Если вы это сделаете, сравните его с четырьмя типами, перечисленными в POD SOAP :: Lite.Ваш пример запроса выглядит как форма Docment / Literal, так что вы можете написать что-то вроде этого:

  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 {} для производственного использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...