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

基于WSDL使用Zeep创建SOAP请求:登录与参数传递问题求助

我之前对接MindBody的SOAP API时也踩过类似的坑,用Zeep的时候得把认证、参数构造和HTTP头这几个点都处理好,给你详细说下怎么解决:

1. 先搞定MindBody的认证参数

MindBody的API不使用普通的HTTP基础认证,而是要求在请求体里传递特定的SourceCredentials(必填)和UserCredentials(可选,用于用户级权限验证)结构。你可以通过Zeep的get_type方法从WSDL中获取对应的类型定义,再构造实例:

from zeep import Client

# 初始化Client
client = Client('https://api.mindbodyonline.com/0_5_1/ClientService.asmx?wsdl')

# 从WSDL中获取认证所需的类型
SourceCredentials = client.get_type('ns0:SourceCredentials')
UserCredentials = client.get_type('ns0:UserCredentials')

# 替换成你的实际认证信息
source_creds = SourceCredentials(
    SourceName='你的SourceName',
    Password='你的API密码',
    SiteIDs=['你的站点ID']  # 注意是数组格式
)
user_creds = UserCredentials(
    Username='你的用户名',
    Password='你的用户密码',
    SiteIDs=['你的站点ID']
)

2. 构造GetClientServices的请求参数

根据MindBody WSDL的定义,GetClientServices方法需要传入包含认证信息和业务参数的结构体。比如要查询指定客户的服务,你需要补充ClientID这类参数:

request_params = {
    'SourceCredentials': source_creds,
    'UserCredentials': user_creds,  # 如果不需要用户级权限可以省略
    'ClientID': '目标客户ID'  # 替换成你要查询的客户ID
}

3. 设置HTTP请求头(SOAPAction和Content-Type)

  • Content-Type:Zeep默认会设置为text/xml; charset=utf-8,但如果需要手动指定,可以通过Transport对象配置全局头:
    from zeep.transports import Transport
    import requests
    
    transport = Transport(
        session=requests.Session(),
        headers={'Content-Type': 'text/xml; charset=utf-8'}
    )
    # 重新初始化Client,传入transport
    client = Client('https://api.mindbodyonline.com/0_5_1/ClientService.asmx?wsdl', transport=transport)
    
  • SOAPAction:Zeep通常会自动从WSDL中解析SOAPAction,但如果需要手动指定,可以在调用方法时通过_soapaction参数传递:

完整调用示例

把上面的步骤整合起来,完整代码如下:

from zeep import Client
from zeep.transports import Transport
import requests

# 配置HTTP传输头
transport = Transport(
    session=requests.Session(),
    headers={'Content-Type': 'text/xml; charset=utf-8'}
)

# 初始化Zeep Client
client = Client('https://api.mindbodyonline.com/0_5_1/ClientService.asmx?wsdl', transport=transport)

# 构造认证参数
SourceCredentials = client.get_type('ns0:SourceCredentials')
UserCredentials = client.get_type('ns0:UserCredentials')

source_creds = SourceCredentials(
    SourceName='你的SourceName',
    Password='你的API密码',
    SiteIDs=['你的站点ID']
)
user_creds = UserCredentials(
    Username='你的用户名',
    Password='你的用户密码',
    SiteIDs=['你的站点ID']
)

# 构造业务请求参数
request_params = {
    'SourceCredentials': source_creds,
    'UserCredentials': user_creds,
    'ClientID': '目标客户ID'
}

# 调用服务并指定SOAPAction
response = client.service.GetClientServices(
    **request_params,
    _soapaction='http://clients.mindbodyonline.com/api/0_5_1/GetClientServices'
)

# 处理响应
print(response)

调试小技巧

如果不确定参数结构是否正确,可以用client.wsdl.dump()打印WSDL的所有类型和方法定义,或者开启日志查看实际发送的SOAP请求:

import logging
logging.basicConfig(level=logging.DEBUG)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:15:15