如何用Python调用基于WCF的SOAP 1.2 API?(GetSiteUnitDataStatus服务)
使用Zeep调用WCF令牌认证的SOAP服务(GetSiteUnitDataStatus)实现指导
1. 配置WCF令牌认证
WCF服务常用的令牌认证方式主要有两种,对应以下实现方案:
方式一:WS-Security UsernameToken认证
如果你的C#示例采用UsernameToken做身份验证,Zeep可直接通过Security插件配置:
from zeep import Client from zeep.wsse.username import UsernameToken # 初始化Zeep客户端 client = Client('https://slc.centershift.com/store40/StoreService.svc?wsdl') # 添加WS-Security认证头 client.wsse = UsernameToken('你的用户名', '你的密码')
方式二:自定义令牌头(如Bearer Token)
若服务要求在HTTP头或SOAP头中传递自定义令牌,可按以下两种场景处理:
HTTP头传递令牌
from zeep import Client from zeep.transports import Transport import requests # 创建带自定义HTTP头的会话 session = requests.Session() session.headers.update({'Authorization': 'Bearer 你的令牌内容'}) transport = Transport(session=session) # 初始化客户端 client = Client('https://slc.centershift.com/store40/StoreService.svc?wsdl', transport=transport)
SOAP头传递令牌
如果令牌需要嵌入SOAP的Header节点,先通过WSDL确认头结构,再构造并传入:
from zeep import Client, xsd client = Client('https://slc.centershift.com/store40/StoreService.svc?wsdl') # 按WSDL定义的头结构构造令牌节点(示例需根据实际服务调整) auth_header = xsd.Element( '{http://schemas.centershift.com/}AuthToken', xsd.ComplexType([ xsd.Element('TokenValue', xsd.String()), ]) ) header_value = auth_header(TokenValue='你的令牌内容') # 调用服务时传入自定义头 result = client.service.GetSiteUnitDataStatus(_soapheaders=[header_value])
2. 构造并调用GetSiteUnitDataStatus服务
第一步:确认服务参数要求
先通过Zeep内置命令查看该服务的参数结构,避免传参错误:
# 打印方法参数说明 print(client.service.GetSiteUnitDataStatus.__doc__) # 导出完整WSDL结构,查看所有类型定义 client.wsdl.dump()
输出内容会明确该方法所需的参数名称、类型(比如可能是SiteID、UnitID等),无需添加第一个接口的LookupUser_Request参数。
第二步:调用服务示例
假设查询后得知需要传入SiteID和StartDate两个参数,调用代码如下:
# 简单参数直接传入 result = client.service.GetSiteUnitDataStatus(SiteID=123, StartDate='2024-01-01') # 若参数为复杂类型,先构造对应对象 # SiteRequest = client.get_type('ns0:SiteRequest') # request_obj = SiteRequest(SiteID=123, StartDate='2024-01-01') # result = client.service.GetSiteUnitDataStatus(request_obj) # 打印返回结果 print(result)
3. 调试与问题排查
若调用失败,优先通过以下方式定位问题:
- 开启调试日志,对比生成的SOAP请求与C#示例的请求XML:
日志会输出完整的请求、响应内容,可检查命名空间、参数结构、认证头是否与C#示例一致。import logging logging.basicConfig(level=logging.DEBUG) - 显式指定命名空间:WCF服务对命名空间要求严格,若出现命名空间不匹配问题,可在调用时指定前缀:
result = client.service['ns0:GetSiteUnitDataStatus'](SiteID=123)
内容的提问来源于stack exchange,提问作者Nipun
相关产品推荐
相关产品推荐

