«Отсутствующие» атрибуты метода при использовании Suds - PullRequest
2 голосов
/ 20 февраля 2012

Я разрабатываю клиент 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 Ответ

1 голос
/ 06 марта 2012

Я нашел решение:

Я использовал "typed" wisdl для создания Клиента, но по какой-то причине Suds не может правильно получить параметры из него. Затем я узнал, что для того же сервиса доступен еще один "нетипизированный" wisdl. Используя его для создания клиента Suds, он может правильно получить сложные параметры для методов, и я успешно построил клиент.

Сервисы, к которым я пытаюсь получить доступ, созданы с помощью SoapLab. Сначала я подумал, что эта проблема с различными WISDL была связана с тем, как SoapLab их создает, но я не эксперт в SoapLab, только пользователь этих сервисов, поэтому я действительно не знаю, что происходит ... С другой стороны Мне удалось создать Perl-клиент с использованием первого wisdl, так что, возможно, это проблема с Suds.

...