Используя сервис WSDL от Python, это мой клиентский код или сервер? - PullRequest
3 голосов
/ 15 августа 2010

Я пытаюсь написать клиент Python для службы WSDL. Я использую библиотеку Suds для обработки сообщений SOAP.

Когда я пытаюсь вызвать службу, я получаю исключение Suds: <rval /> не сопоставлено с частью сообщения. Если я установлю параметр retxml Suds, я получу XML, который мне подходит.

Проблема с клиентским кодом? Я пропускаю какой-то флаг, который позволит Suds правильно анализировать XML? Кроме того, проблема может быть с сервером. Правильно ли структурирован XML?

Мой код следующий (имена методов изменены):

c = Client(url)  
p = c.factory.create('MyParam')  
p.value = 100  
c.service.run(p)  

Это приводит к исключению Suds:

File "/home/.../test.py", line 38, in test  
res = self.client.service.run(p)
File "/usr/local/lib/python2.6/dist-packages/suds-0.3.9-py2.6.egg/suds/client.py", line 539, in __call__
return client.invoke(args, kwargs)
File "/usr/local/lib/python2.6/dist-packages/suds-0.3.9-py2.6.egg/suds/client.py", line 598, in invoke
result = self.send(msg)
File "/usr/local/lib/python2.6/dist-packages/suds-0.3.9-py2.6.egg/suds/client.py", line 627, in send  
result = self.succeeded(binding, reply.message)  
File "/usr/local/lib/python2.6/dist-packages/suds-0.3.9-py2.6.egg/suds/client.py", line   659, in succeeded  
r, p = binding.get_reply(self.method, reply)  
File "/usr/local/lib/python2.6/dist-packages/suds-0.3.9-py2.6.egg/suds/bindings/binding.py", line 151, in get_reply  
result = self.replycomposite(rtypes, nodes)  
File "/usr/local/lib/python2.6/dist-packages/suds-0.3.9-  py2.6.egg/suds/bindings/binding.py", line 204, in replycomposite  
raise Exception('<%s/> not mapped to message part' % tag)  
Exception: <rval/> not mapped to message part  

Возвращенный XML (изменен для удаления идентификаторов клиентов)

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <ns2:getResponse xmlns:ns2="http://api.xxx.xxx.com/api/">
      <rval xmlns="http://xxx.xxx.xxx.com/api/">
        <ns2:totalNumEntries>
          2
        </ns2:totalNumEntries>
        <ns2:entries>
          <ns2:id>
            1
          </ns2:id>
        </ns2:entries>
        <ns2:entries>
          <ns2:id>
            2
          </ns2:id>
        </ns2:entries>
      </rval>
    </ns2:getResponse>
  </S:Body>
</S:Envelope>

Ответы [ 2 ]

2 голосов
/ 23 сентября 2013

Возможное дублирование Что такое suds означает "<код ошибки /> не сопоставлен с частью сообщения"?

Вот мой ответ на этот вопрос:

У меня была похожая проблема, когда вызов был успешным, и произошел сбой Suds при разборе ответа от клиента. Обходной путь, который я использовал, состоял в том, чтобы использовать параметр Suds для возврата необработанного XML и затем использовать BeautifulSoup для анализа ответа.

Пример:

client = Client(url)
client.set_options(retxml=True)
soapresp_raw_xml = client.service.submit_func(data)
soup = BeautifulStoneSoup(soapresp_raw_xml)
value_i_want = soup.find('ns:NewSRId')
1 голос
/ 01 августа 2014

Это исключение фактически означает, что ответ от SOAP-сервиса содержит тег <rval>, которого нет в WSDL-схеме сервиса.

Имейте в виду, что библиотека Suds кэширует WSDL-схему, поэтому проблема может возникнуть, если WSDL-схема была недавно изменена. Затем ответы соответствуют новой схеме, но проверяются suds-клиентом со старой. В этом случае rm /tmp/suds/* поможет вам.

...