Pouvez-vous m'aider à résoudre ce problème SUDS / SOAP?
J'essaye d'accéder à cette api https://www.clarityaccounting.com/api-docs/ à l'aide de la MOUSSE. Voici le code qui devrait fonctionner:
from suds.client import Client
client = Client('https://www.clarityaccounting.com/api/v1?wsdl')
token = client.service.doLogin('demo', 'demo', 'www.kashoo.com', 'en_US', 300000)
Mais j'obtiens cette erreur:
WebFault: Server raised fault: 'No such operation: (HTTP GET PATH_INFO: /api/v1)'
Leur soutien gars dit que la requête devrait ressembler à ceci:
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:api="http://api.service.books/">
<SOAP-ENV:Body>
<api:doLogin>
<username>demo</username>
<password>demo</password>
<siteName>www.kashoo.com</siteName>
<locale>en_US</locale>
<duration>300000</duration>
</api:doLogin>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Mais SUDS' ressemble à ceci:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:ns0="http://api.service.books/"
xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns1:Body>
<ns0:doLogin>
<username>demo</username>
<password>demo</password>
<siteName>www.kashoo.com</siteName>
<locale>en_US</locale>
<duration>300000</duration>
</ns0:doLogin>
</ns1:Body>
</SOAP-ENV:Envelope>
Je suis un vrai SAVON et de la MOUSSE de débutant, mais j'ai entendu dire que la MOUSSE est le meilleur SAVON bibliothèque à utiliser à partir d'ici: Ce client SOAP bibliothèques existent pour Python, et où la documentation est-elle pour eux?
Donc ma question est tout simplement ce que sont les éléments essentiels qui sont différents et qui font l'échec de la demande et comment puis-je configurer les SUDS à envoyer correctement formaté demande?
source d'informationauteur sheats
Vous devez vous connecter pour publier un commentaire.
Semble être à première vue le problème que vous rencontrez est avec SSL. Vous accédez à une URL https, et le gestionnaire de Transport pour la mousse.client pourparlers http par défaut.
Le problème
Si vous regardez à la fin du fichier WSDL, il est de spécifier l'emplacement par défaut comme
http://www.clarityaccounting.com/api/v1
, qui est une URL http, mais le WSDL est SSL.Si vous faites un http GET sur l'URL, vous obtenez le message d'erreur que vous avez reçu:
La Solution
Pour corriger cela, vous devez remplacer la valeur par défaut emplacement lorsque vous appelez la
Client
constructeur pour le faire coller avec https:Victoire!
Pro conseil pour l'avenir des fins de débogage: Activer la journalisation complète de débogage. La MOUSSE s'utilise le standard
logging
de la bibliothèque, de sorte qu'il vous donne beaucoup de contrôle. Donc j'ai démarré tout àDEBUG
:C'est ce qui m'a aidé à le réduire, car il était clairement en disant que c'était l'envoi de plus de http:
Et puis la réponse l'a dit ainsi:
Il ne devrait pas être un problème lié à la connexion à un service via le protocole HTTPS. Je suis en utilisant de la mousse pour faire la même chose. J'en ai essayé quelques approches de votre fichier WSDL (pas un expert moi-même) et a rencontré la même erreur. Ce que vous devez faire en tant que pratique avec de la mousse est bien d'utiliser le usine méthode, par exemple
Où ce qui est envoyé à la fonction create est l'un des types définis dans le fichier WSDL. Si vous créez ce type dans l'interpréteur de commandes que vous pouvez exécuter d'impression 'connexion' pour voir ses autres propriétés.
Espère au moins vous indique où le problème n'est pas (avec HTTPS). J'ai également remarqué que le soapAction les en-têtes ne sont pas définies dans le fichier WSDL, vous ne savez pas comment faire de la mousse ou le service traite les demandes de sans que.
À l'aide de mousse jurko https://pypi.python.org/pypi/suds-jurko qui est un fork de la mousse.
Vous pouvez passer dans un __injecter de l'option où vous pouvez lui donner le raw xml que vous souhaitez envoyer.
J'ai l'impression que je doit documenter toutes les façons que l'on peut inspecter les Premières de savon qui mousse génère ici.
À l'aide d'un nosend drapeau lors de la construction du client. Veuillez noter qu'avec l'indicateur a la valeur True, la mousse va tout simplement de générer le savon, mais de ne pas l'envoyer.
client =Client(url, nosend=True)
res = client.service.example()
print res.envelope
#imprime les premières savonUtilisation de la journalisation. Ici, nous sommes seulement journalisation de la mousse.de transport.http, il n'affichera que tout ce qui est envoyé/reçu.
import logging
import sys
handler = logging.StreamHandler(sys.stderr)
logger = logging.getLogger('suds.transport.http')
logger.setLevel(logging.DEBUG), handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
À l'aide de la MessagePlugin
from suds.plugin import MessagePlugin
class MyPlugin(MessagePlugin):
def marshalled(self, context):
#import pdb; pdb.set_trace()
print context.envelope.str()
client = Client(url, plugins=[MyPlugin()])
Non seulement le MessagePlugin vous donner la possibilité d'inspecter le savon générés, mais vous pouvez également le modifier avant de l'envoyer, voir-> https://jortel.fedorapeople.org/suds/doc/suds.plugin.MessagePlugin-class.html