如何使用Python Zeep为SOAP请求元素设置属性
使用Python Zeep构造带属性的SOAP请求
嘿,我来帮你搞定用Zeep构造这个SOAP请求的问题!要设置XML元素的属性,Zeep提供了专门的_kwargs参数来处理,下面一步步给你演示具体实现:
1. 初始化Zeep客户端
首先导入Zeep并创建SOAP客户端,替换成你的实际WSDL地址:
from zeep import Client # 替换为你的WSDL地址 client = Client('http://your-wsdl-endpoint?wsdl')
2. 构造带属性的<header>元素
你的<header>元素带有requestId和usageMode两个属性,同时还有子元素。Zeep中需要通过类型对象来创建带属性的元素,步骤如下:
- 先通过
client.get_type()获取WSDL中定义的header类型(类型名称需要根据你的WSDL实际定义调整,比如可能是ns0:header) - 创建对象时,用
_kwargs参数传递属性键值对,其余参数对应子元素内容
示例代码:
# 获取header对应的复杂类型(请根据你的WSDL调整类型名称) HeaderType = client.get_type('ns0:header') # 创建带属性的header对象 request_header = HeaderType( systemName='YourSystemName', # 子元素内容 timestamp='2024-05-20T14:30:00', # 格式建议符合WSDL要求的ISO时间格式 userName='YourUserName', _kwargs={ 'requestId': 'UNIQUE_REQUEST_ID_001', # 设置requestId属性 'usageMode': 'PRODUCTION' # 设置usageMode属性 } )
小提示:如果不确定类型名称,可以运行
client.wsdl.dump()打印WSDL的所有类型和方法定义,找到对应的header类型。
3. 构造请求的<body>部分
<body>里的<fetchProperty>支持重复多次,所以可以构造一个列表来传递多个属性名称:
# 构造多个fetchProperty项 fetch_properties = [ {'propertyName': 'UserEmail'}, {'propertyName': 'UserRole'}, {'propertyName': 'UserStatus'} ] # 构造body内容 request_body = { 'fetchProperty': fetch_properties, 'id': 'TARGET_RECORD_ID' # 替换为实际的ID值 }
4. 发起SOAP请求
最后调用对应的SOAP方法(这里假设方法名为getRequest),传入构造好的header和body:
# 调用SOAP服务方法 response = client.service.getRequest( header=request_header, body=request_body ) # 打印响应结果 print(response)
额外注意事项
- 如果
<fetchProperty>也是WSDL中定义的复杂类型,同样需要用client.get_type()创建对象,而不是直接用字典 - 确保所有参数的格式和取值符合WSDL的约束(比如timestamp的格式、usageMode的可选值等)
- 若遇到命名空间问题,可以在创建客户端时指定命名空间,或者在获取类型时明确指定命名空间前缀
内容的提问来源于stack exchange,提问作者Piotr W.
相关产品推荐
相关产品推荐

