我正在開發一個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如何期待這種投入將是非常有用的。
非常感謝您的幫助。