2011-01-06 63 views
1

由於某種原因,SourceGear在其安裝上提供了未公開的Web服務。他們實際上要求開發人員使用API​​,因爲Web服務有點麻煩,但這對我來說是個問題,因爲我不能在Perl環境中使用此API,所以他們針對我的特定情況的解決方案是使用Web服務。如何使用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中列出的四種類型進行比較。 您的請求示例如下的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回來,我會嘗試用替換構造函數調用:

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在失敗時喜歡死()。將您的呼叫包裝在eval {}中以供生產使用。

+0

感謝代理方式轉變爲正常工作我只有一些問題,因爲服務返回1002作爲LoginPlainTextResult和空值strAuthTicket我仍然不知道這意味着什麼,但至少我得到了答覆。 – user565793 2011-01-11 20:58:36