我最近偶然发现了同样的问题。这是我的解决方案的概要:
需要的基本组成代码块
以下是您的客户端应用程序所需的基本代码块
- 会话请求部分:请求与提供者的会话
- 会话身份验证部分:向提供者提供凭据
- 客户端部分:创建客户端
- 安全标头部分:将 WS-Security 标头添加到客户端
- 消费部分:根据需要消费可用的操作(或方法)
你需要什么模块?
许多人建议使用 Python 模块,例如 urllib2 ;然而,没有一个模块可以工作——至少对于这个特定的项目是这样。
因此,这是您需要获取的模块列表。首先,您需要从以下链接下载并安装最新版本的 suds:
pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2
此外,您需要分别从以下链接下载和安装 requests 和 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)
结果:
这是我的情况的结果。请注意,服务器返回 HTTP 200。这是 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
},
})