Geçenlerde aynı sorunla karşılaştım. İşte çözümümün özeti:
Temel kurucu kod blokları gerekli
Aşağıdakiler, istemci uygulamanız için gerekli temel kod bloklarıdır
- Oturum isteği bölümü: sağlayıcıyla bir oturum talep edin
- Oturum kimlik doğrulama bölümü: sağlayıcıya kimlik bilgileri sağlayın
- İstemci bölümü: İstemciyi oluşturun
- Güvenlik Başlığı bölümü: WS-Security Başlığını İstemciye ekleyin
- Tüketim bölümü: gerektiğinde mevcut işlemleri (veya yöntemleri) kullanın
Hangi modüllere ihtiyacınız var?
Birçoğu urllib2 gibi Python modüllerini kullanmayı önerdi; ancak, modüllerin hiçbiri çalışmıyor - en azından bu özel proje için.
İşte almanız gereken modüllerin listesi. Her şeyden önce, aşağıdaki bağlantıdan suds'ın en son sürümünü indirip yüklemeniz gerekir:
pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2
Ek olarak, sırasıyla aşağıdaki bağlantılardan istekleri ve suds_requests modüllerini indirmeniz ve yüklemeniz gerekir (sorumluluk reddi: Burada yayınlamak için yeniyim, bu nedenle şimdilik birden fazla bağlantı gönderemiyorum).
pypi.python.org/pypi/requests
pypi.python.org/pypi/suds_requests/0.1
Bu modülleri başarıyla indirip kurduktan sonra, gitmekte fayda var.
Kod
Daha önce açıklanan adımları izleyerek, kod aşağıdaki gibi görünür: İçe Aktarmalar:
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
Oturum isteği ve kimlik doğrulama:
username=input('Username:')
password=input('password:')
session = requests.session()
session.auth=(username, password)
İstemciyi Oluşturun:
client = Client(WSDL_URL, faults=False, cachingpolicy=1, location=WSDL_URL, transport=suds_requests.RequestsTransport(session))
WS-Security Başlığı Ekle:
...
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)
Lütfen bu yöntemin Şekil 1'de gösterilen güvenlik başlığını oluşturduğuna dikkat edin. Dolayısıyla, uygulamanız, tüketmekte olduğunuz hizmetin sahibi tarafından sağlanan doğru güvenlik başlığı biçimine bağlı olarak değişebilir.
İlgili yöntemi (veya işlemi) kullanın:
result=client.service.methodName(Inputs)
Günlük kaydı :
Bu tür uygulamalardaki en iyi uygulamalardan biri, iletişimin nasıl yürütüldüğünü görmek için günlüğe kaydetmektir. Bir sorun olması durumunda, hata ayıklamayı kolaylaştırır. Aşağıdaki kod, temel günlük kaydı yapar. Ancak, kodda gösterilenlere ek olarak iletişimin birçok yönünü de günlüğe kaydedebilirsiniz.
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
Sonuç:
İşte benim durumumdaki sonuç. Sunucunun HTTP 200 döndürdüğünü unutmayın. Bu, HTTP istek yanıtı için standart başarı kodudur.
(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
},
})