如何用Zeep在Python中跳过Request_References仅传递Response_Filter
问题:使用Zeep跳过SOAP请求中的Request_References元素
需求是构造仅包含Response_Filter的Workday Get_Workers SOAP请求,跳过Request_References元素。原始SOAP请求示例如下:
<?xml version="1.0" encoding="UTF-8"?> <wd:Get_Workers_Request xmlns:wd="urn:com.workday/bsvc" wd:version="v38.0"> <wd:Request_References wd:Skip_Non_Existing_Instances="true" wd:Ignore_Invalid_References="true"> <wd:Worker_Reference> <wd:ID wd:type="Employee_ID">abcdef</wd:ID> </wd:Worker_Reference> </wd:Request_References> <wd:Response_Filter> <wd:As_Of_Effective_Date>2022-09-03</wd:As_Of_Effective_Date> <wd:As_Of_Entry_DateTime>2022-09-03T14:26:34</wd:As_Of_Entry_DateTime> <wd:Page>1</wd:Page> <wd:Count>100</wd:Count> </wd:Response_Filter> </wd:Get_Workers_Request>
当传入包含Request_References相关字段的字典时请求可正常运行:
request_dict = { 'Worker_Reference': { 'ID': { 'type': 'Employee_ID', '_value_1': employee_id }, 'Descriptor': None }, 'Skip_Non_Existing_Instances': None, 'Ignore_Invalid_References': None }
但尝试给Request_References赋值xsd.SkipValue跳过该元素时,请求无法正常运行:
client = Client(url, wsse=UsernameToken(user, password), plugins=[history]) request_dict = { 'Request_References': xsd.SkipValue, 'Response_Filter': { 'Page': '1', 'Count': '1' } } client.service.Get_Workers(request_dict)
解决方案
方法1:直接省略Request_References键
Zeep会自动忽略WSDL中标记为可选的元素,因此直接构造不包含Request_References的请求字典即可:
client = Client(url, wsse=UsernameToken(user, password), plugins=[history]) request_dict = { 'Response_Filter': { 'Page': '1', 'Count': '1' } } client.service.Get_Workers(request_dict)
方法2:使用create_message手动构建请求
如果方法1无效,可通过client.create_message精准控制SOAP消息结构,只传入需要的元素:
client = Client(url, wsse=UsernameToken(user, password), plugins=[history]) # 构造仅包含Response_Filter的请求消息 message = client.create_message( client.service.Get_Workers, **{ 'Response_Filter': { 'Page': '1', 'Count': '1' } } ) # 发送请求并获取响应 response = client.send(message)
方法3:传递空的Request_References结构(若元素为必选)
如果WSDL定义Request_References是必选元素,无法完全跳过,可传递空的引用列表来满足服务要求:
request_dict = { 'Request_References': { 'Worker_Reference': [] }, 'Response_Filter': { 'Page': '1', 'Count': '1' } } client.service.Get_Workers(request_dict)
内容的提问来源于stack exchange,提问作者Jshang
相关产品推荐
相关产品推荐

