"Отсутствующие" атрибуты метода при использовании Suds
Я разрабатываю 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: '
Таким образом, кажется, что вход не достигает правильно службы...
Любые идеи о том, как решить эту проблему, или как я могу выяснить, как судьи ожидают, что этот вклад будет, будут очень полезны.
Большое спасибо за Вашу помощь.
1 ответ
Я нашел решение:
Я использовал "typed" wisdl для создания Клиента, но по какой-то причине Suds не может правильно получить параметры из него. Затем я узнал, что для того же сервиса доступен другой " нетипизированный " wisdl. Используя его для создания клиента Suds, он может правильно получить сложные параметры для методов, и я успешно создал клиент.
Сервисы, к которым я пытаюсь получить доступ, созданы с помощью SoapLab. Сначала я подумал, что эта проблема с различными WISDL была связана с тем, как SoapLab их создает, но я не эксперт в SoapLab, только пользователь этих сервисов, поэтому я действительно не знаю, что происходит... С другой стороны Я смог создать Perl-клиент, используя первый wisdl, так что, возможно, это проблема с Suds.