1

出于某种原因,SourceGear在他们的安装中提供了一个未记录的 Web 服务。他们实际上要求开发人员改用 API,因为 Web 服务有点混乱,但在我的情况下这是一个问题,因为我不能在 Perl 环境中使用这个 API,所以他们针对我的具体情况的解决方案是使用 Web 服务。

这应该不是问题。使用SOAP::Lite我过去以同样的方式连接到多个 Web 服务。但是,如果您不知道可以在哪里进行 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'),
    ]))
);

任何提示将不胜感激。

4

1 回答 1

0

首先指向 wget/curl/lwp/etc。在http://velecloudserver/fortress/dragnetwebservice.asmx?WSDL 并查看您是否获得了 WSDL 文件。

如果您这样做,请将其与 SOAP::Lite POD 中列出的四种类型进行比较。您的请求示例看起来像 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 是否与我使用 soapUI.org java 客户端获得的一些工作 XML 匹配。

我不得不阅读 POD 几次,并深入研究了源代码以了解我们的一些方法(如 default_ns())如何影响生成的 XML。一旦我这样做了,这一切就变得更有意义了。

注意:SOAP::Lite 喜欢在失败时使用 die()。将您的调用封装在 eval{} 中以供生产使用。

于 2011-01-11T03:59:49.973 回答