You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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:
    import logging
    logging.basicConfig(level=logging.DEBUG)
    
    日志会输出完整的请求、响应内容,可检查命名空间、参数结构、认证头是否与C#示例一致。
  • 显式指定命名空间:WCF服务对命名空间要求严格,若出现命名空间不匹配问题,可在调用时指定前缀:
    result = client.service['ns0:GetSiteUnitDataStatus'](SiteID=123)
    

内容的提问来源于stack exchange,提问作者Nipun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 07:42:57