Je suis récemment tombé sur le même problème. Voici le synopsis de ma solution:
Blocs de code constitutifs de base nécessaires
Voici les blocs de code de base requis de votre application cliente
- Section de demande de session: demander une session avec le fournisseur
- Section d'authentification de session: fournissez les informations d'identification au fournisseur
- Section client: créer le client
- Section d'en-tête de sécurité: ajoutez l'en-tête WS-Security au client
- Section consommation: consommer les opérations (ou méthodes) disponibles selon les besoins
De quels modules avez-vous besoin?
Beaucoup ont suggéré d'utiliser des modules Python tels que urllib2; cependant, aucun des modules ne fonctionne, du moins pour ce projet particulier.
Alors, voici la liste des modules dont vous avez besoin. Tout d'abord, vous devez télécharger et installer la dernière version de suds à partir du lien suivant:
pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2
De plus, vous devez télécharger et installer respectivement les requêtes et les modules suds_requests à partir des liens suivants (avertissement: je suis nouveau pour publier ici, je ne peux donc pas publier plus d'un lien pour le moment).
pypi.python.org/pypi/requests
pypi.python.org/pypi/suds_requests/0.1
Une fois que vous avez téléchargé et installé ces modules avec succès, vous êtes prêt à partir.
Le code
En suivant les étapes décrites précédemment, le code ressemble à ce qui suit: Importations:
import logging
from suds.client import Client
from suds.wsse import *
from datetime import timedelta,date,datetime,tzinfo
import requests
from requests.auth import HTTPBasicAuth
import suds_requests
Demande de session et authentification:
username=input('Username:')
password=input('password:')
session = requests.session()
session.auth=(username, password)
Créez le client:
client = Client(WSDL_URL, faults=False, cachingpolicy=1, location=WSDL_URL, transport=suds_requests.RequestsTransport(session))
Ajouter l'en-tête WS-Security:
...
addSecurityHeader(client,username,password)
....
def addSecurityHeader(client,username,password):
security=Security()
userNameToken=UsernameToken(username,password)
timeStampToken=Timestamp(validity=600)
security.tokens.append(userNameToken)
security.tokens.append(timeStampToken)
client.set_options(wsse=security)
Veuillez noter que cette méthode crée l'en-tête de sécurité représenté sur la figure 1. Ainsi, votre implémentation peut varier en fonction du format d'en-tête de sécurité correct fourni par le propriétaire du service que vous utilisez.
Consommez la méthode (ou l'opération) appropriée:
result=client.service.methodName(Inputs)
Journalisation :
L'une des meilleures pratiques dans des implémentations telles que celle-ci consiste à se connecter pour voir comment la communication est exécutée. En cas de problème, cela facilite le débogage. Le code suivant effectue la journalisation de base. Cependant, vous pouvez enregistrer de nombreux aspects de la communication en plus de ceux décrits dans le code.
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
Résultat:
Voici le résultat dans mon cas. Notez que le serveur a renvoyé HTTP 200. Il s'agit du code de réussite standard pour la requête-réponse HTTP.
(200, (collectionNodeLmp){
timestamp = 2014-12-03 00:00:00-05:00
nodeLmp[] =
(nodeLmp){
pnodeId = 35010357
name = "YADKIN"
mccValue = -0.19
mlcValue = -0.13
price = 36.46
type = "500 KV"
timestamp = 2014-12-03 01:00:00-05:00
errorCodeId = 0
},
(nodeLmp){
pnodeId = 33138769
name = "ZION 1"
mccValue = -0.18
mlcValue = -1.86
price = 34.75
type = "Aggregate"
timestamp = 2014-12-03 01:00:00-05:00
errorCodeId = 0
},
})