2010-08-14 26 views
2

J'essaye d'écrire un client Python pour un service WSDL. J'utilise la bibliothèque Suds pour gérer les messages SOAP.En utilisant le service WSDL de Python, c'est mon code client ou le serveur?

Lorsque j'essaie d'appeler le service, j'obtiens une exception Suds: <rval /> non mappé à la partie message. Si je définis l'option retxml Suds, j'obtiens du XML qui me semble correct.

Le problème est-il lié au code client? Ai-je manqué un drapeau qui permettra à Suds d'analyser correctement le XML? Alternativement, le problème pourrait être avec le serveur. Le XML n'est-il pas structuré correctement?

Mon code est suit (noms de méthode modifiée):

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

Il en résulte une exception 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 

Le code XML retourné (modifié pour supprimer les identificateurs client)

<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> 

Répondre

1

Possible dup de What does suds mean by "<faultcode/> not mapped to message part"?

Voici ma réponse à cette question:

J'ai eu un problème similaire où l'appel a réussi, et Suds s'est brisé sur l'analyse de la réponse du client. La solution de contournement que j'ai utilisée était d'utiliser le Suds option to return raw XML et ensuite utiliser BeautifulSoup pour analyser la réponse.

Exemple:

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

Cette exception signifie en fait que la réponse du service SOAP contient tag <rval>, qui n'existe pas dans le schéma WSDL du service. Gardez à l'esprit que la bibliothèque Suds met en cache le schéma WSDL, c'est pourquoi le problème peut se produire si le schéma WSDL a été modifié récemment. Ensuite, les réponses correspondent au nouveau schéma, mais sont vérifiées par le client suds avec l'ancien. Dans ce cas rm /tmp/suds/* vous aidera.