2011-01-06 20 views
1

何らかの理由で、SourceGearは、インストール時に文書化されていないWebサービスを提供します。彼らは実際にはWebサービスがちょっと面倒なので、代わりにAPIを使用するようにデベロッパーに依頼していますが、このAPIはPerl環境では使用できないため、私の場合は問題です。SOAP :: Liteを使用してSourceGear 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'), 
    ])) 
); 

いずれのヒントもありがとうございます。

答えて

0

wget/curl/lwp/etcを指すことから始めます。 http://velecloudserver/fortress/dragnetwebservice.asmx?WSDL にあり、WSDLファイルが戻ってくるかどうか確認してください。

これを行う場合は、SOAP :: Lite PODにリストされている4つのタイプと比較してください。 リクエストの例はDocment /リテラル​​形式のように見えるので、あなたはこのような何かを書くことに終わるかもしれない:

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を取得しない場合、私はコンストラクタの呼び出しを交換してみたい:

私がSOAP :: Liteで最後に作業したときに、私は上記のような短いプログラムを書いて、デバッガで実行しました。 $ soap-> call()行を実行する前に、$ soapオブジェクトの要点を調べ、要求ペイロードを調べて、soapUI.org Javaクライアントを使ってXMLが動作していたXMLと一致するかどうかを調べました。

私はPODを数回読んでいました。私はdefault_ns()のようないくつかのメソッドが生成されたXMLにどのように影響するかを調べるためにソースを掘り下げました。一度それをしたら、それはもっと意味を成し遂げました。

注:SOAP :: Liteは、失敗したときにdie()するのが好きです。プロダクション用にeval {}にあなたの呼び出しをラップします。

+0

サービスが私に1002を返すため、プロンプトの方法がちょうどうまくいくようになりました。私は1002をLoginPlainTextResultとして返すので、strAuthTicketのnull値はまだ分かりません。 – user565793

関連する問題