1

何らかの理由で、 SourceGearは、そのインストールで文書化されていない Web サービスを提供しています。彼らは実際には開発者に代わりに API を使用するように依頼しています。これは Web サービスがややこしいためですが、これは私の場合は問題です。なぜなら、この API は Perl 環境では使用できないためです。私の特定のケースに対する彼らの解決策は、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 にリストされている 4 つのタイプと比較してください。Request の例は Document/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 オブジェクトの中身を調べてリクエスト ペイロードを調べ、soapUI.org Java クライアントを使用して取得した動作中の XML と XML が一致するかどうかを確認しました。

POD を数回読む必要があり、ソースを掘り下げて、default_ns() などのメソッドの一部が生成された XML にどのように影響したかを把握しました。私がそれをしたら、それはすべてもっと理にかなっています.

注: SOAP::Lite は、失敗したときに die() するのが好きです。本番環境で使用するために呼び出しを eval{} でラップします。

于 2011-01-11T03:59:49.973 に答える