基于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
相关产品推荐
相关产品推荐

