2012-02-20 42 views
2

我正在開發一個Soap客戶端並使用Suds,並且遇到問題。我創建客戶端,只是打印出來就知道可用的方法:使用Suds時「Missing」方法屬性

wsdl_url='http://ws04.iula.upf.edu/soaplab2-axis/typed/services/tokenization.freeling_tokenizer?wsdl' 
    FL_ws=Client(wsdl_url) 
    print FL_ws 

而且我的輸出是(我刪除了一些零件,以緩解讀):

Ports (1): 
    (freeling_tokenizerPort) 
    Methods (11): 
     clear(ns2:jobId jobId,) 
     describe() 
     getLastEvent(ns2:jobId jobId,) 
     getResults(ns2:jobId jobId,) 
     run(ns1:language language,) 
     runAndWaitFor(ns1:language language,) 
    Types (22): 
     ns1:RunAndWaitFor 
     ns1:appInputs 
     ns1:appResults 
     ns2:describeRequest 
     ns2:jobId 

注意這裏是有很多方法一個缺失的屬性吃完了,例如:runAndWaitFor(ns1:language language,)。按照WISDL,這缺少的屬性是一個文本,可以給出直接的數據或網址:

<xs:complexType name="appInputs"> 
<xs:sequence> 
    <xs:choice id="input"> 
    <xs:element name="input_direct_data" type="xs:string"/> 
    <xs:element name="input_url" type="xs:string"/> 
    </xs:choice> 
    <xs:element name="language"> 
    <xs:simpleType> 
    <xs:restriction base="xs:string"> 
    <xs:enumeration value="en"/> 
    <xs:enumeration value="es"/> 
    </xs:restriction> 
    </xs:simpleType> 
    </xs:element> 
</xs:sequence> 
</xs:complexType> 

然後,我不知道如何調用此方法。在Perl中,它工作正常定義和輸入結構是這樣的:

# Inputs structure 
my $inputs = { 
    input_direct_data => "$input_direct_data", 
    language => "$language" 
}; 

所以我試過如下:

input = FL_ws.factory.create('ns1:appInputs') 
    input['input_direct_data']='The house is red.' 
    input['language']='en' 
    result=FL_ws.service.runAndWaitFor(input) 
    print result 

但是,泡沫生成的XML是不正確的:

<ns1:Body> 
    <ns0:runAndWaitFor> 
    <language> 
     <input_direct_data>The house is red.</input_direct_data> 
     <language>en</language> 
    </language> 
    </ns0:runAndWaitFor> 
</ns1:Body> 

由於它將input_direct_data置於<language>之下。我發現this帖子中存在與XML類似的問題,但他們的解決方案對我無效。在我看來,我的問題與Suds如何處理選擇輸入有關,因爲它似乎不接受input_direct_data作爲參數。

我得到的錯誤永遠是:

suds.WebFault: Server raised fault: 'Soaplab not able to process the input request: ' 

如此看來,輸入不正確到達服務...

有關如何解決這個問題,或者我怎麼能計算任何想法瞭解Suds如何期待這種投入將是非常有用的。

非常感謝您的幫助。

回答

1

我已經找到了解決辦法:

我用的是"typed" wisdl創建客戶端,但是,由於某種原因,肥皂水不能從中得到正確的參數。然後,我瞭解到還有另一種可用於同一服務的智慧。使用它創建Suds客戶端,它能夠正確獲取方法的複雜參數,併成功構建客戶端。

我試圖訪問的服務已經使用SoapLab創建。首先,我認爲這個問題與不同的WISDLs有關SoapLab如何創建它們,但我不是SoapLab的專家,只是這些服務的用戶,所以我真的不知道發生了什麼......另一方面, ,我能夠使用第一個智慧創建一個perl客戶端,所以也許這是Suds的問題。