我最近偶然发现了同样的问题。这是我的解决方案的摘要:
所需的基本组成代码块
以下是客户端应用程序所需的基本代码块
- 会话请求部分:请求与提供者进行会话
- 会话认证部分:向提供者提供凭据
- 客户端部分:创建客户端
- 安全标题部分:将WS-Security标头添加到客户端
- 消耗部分:根据需要消耗可用的操作(或方法)
您需要什么模块?
许多建议使用Python模块,例如urllib2;但是,这些模块都不起作用-至少对于该特定项目不起作用。
因此,这是您需要获取的模块列表。首先,您需要从以下链接下载并安装最新版本的suds:
pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2
此外,您需要分别从以下链接下载和安装请求和suds_requests模块(免责声明:我是新来此发布者,因此我现在不能发布多个链接)。
pypi.python.org/pypi/requests
pypi.python.org/pypi/suds_requests/0.1
一旦成功下载并安装了这些模块,就可以了。
代码
按照前面概述的步骤,代码如下所示:导入:
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
会话请求和身份验证:
username=input('Username:')
password=input('password:')
session = requests.session()
session.auth=(username, password)
创建客户端:
client = Client(WSDL_URL, faults=False, cachingpolicy=1, location=WSDL_URL, transport=suds_requests.RequestsTransport(session))
添加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)
请注意,此方法将创建图1所示的安全标头。因此,您的实现可能会有所不同,具体取决于所使用服务的所有者提供的正确安全标头格式。
消耗相关的方法(或操作):
result=client.service.methodName(Inputs)
正在记录:
在这种实现中的最佳实践之一是记录日志,以查看通信是如何执行的。万一有问题,它使调试变得容易。以下代码进行基本日志记录。但是,除了代码中描述的内容外,您还可以记录通信的许多方面。
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
结果:
这是我的情况的结果。请注意,服务器返回了HTTP200。这是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
},
})