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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:31:20