Я разрабатываю клиент Soap с Suds, и у меня проблема. Я создаю клиента и просто распечатываю его, чтобы узнать доступные методы:
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, этот отсутствующий атрибут представляет собой текст, который может быть задан как прямые данные или как URL:
<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, сгенерированный Suds, неверен:
<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>
. Я нашел этот пост с похожей проблемой с XML, но их решение не работает для меня. Мне кажется, что моя проблема связана с тем, как Suds работает с выбором ввода, так как он не принимает input_direct_data в качестве параметра.
Я всегда получаю ошибку:
suds.WebFault: Server raised fault: 'Soaplab not able to process the input request: '
Похоже, что ввод не работает корректно ...
Любые идеи о том, как решить эту проблему, или как я могу выяснить, как судьи ожидают, что этот вклад будет, будут очень полезны.
Большое спасибо за помощь.