使用Zeep发送SOAP请求时zeep.xsd.SkipValue未正常生效问题
Zeep跳过必填SOAP字段
projectAa的正确方法 问题背景
之前用Zeep通过WSDL发送SOAP请求一切正常,现在projectAa字段被设为必填,但我需要在请求中完全省略这个标签。查Zeep文档说zeep.xsd.SkipValue可以跳过字段验证,但实际使用后,生成的XML里projectAa的值变成了字符串"SkipValue",根本没跳过该标签。
我的代码:
applicationData = { 'techSheet': { 'code': "test", 'projectAa': zeep.xsd.SkipValue, 'email': "test", 'TechList': { 'Tech': { 'publicValue': "0", 'privateValue': "0", 'requestedValue': "0", 'TechBudgetList': { 'TechBudget': expenses }, } } }, 'techSheetEvaluation': { 'projectAa':zeep.xsd.SkipValue, 'decisionNumber': '-', 'evaluationStatus': '1', } } print(zeep.xsd.SkipValue) response = client.service.addTechnicalSheetAndEvaluation(**applicationData) print("OPSAA CODE IS ", response)
生成的XML片段:
... <techSheet email="" contactEmail="" code="0000356060" projectAa="SkipValue"> <TechList> <Tech requestedValue="0" privateValue="0" publicValue="0"> <TechBudgetList> <TechBudget xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" aa="1" investmentDescription="Δαπάνες Πρόωρης Συνταξιοδότησης" requestedValue="2470.84" privateValue="0" publicValue="2470.84" actionCode="97.1_21A" expenseSubcategoryCode="M113" xsi:type="ns0:techBudgetAnalysisBase"/> </TechBudgetList> </Tech> </TechList> </techSheet> <techSheetEvaluation evaluationStatus="1" decisionNumber="-" projectAa="SkipValue"/> ...
解决方案
方法1:移除字段键+关闭严格模式
直接从字典中删掉projectAa的键值对,同时创建Zeep客户端时开启非严格模式,跳过WSDL的必填字段校验:
- 修改客户端初始化代码:
from zeep import Client # 添加strict=False关闭严格校验 client = Client(wsdl="你的WSDL地址", strict=False)
- 修改请求数据字典,移除所有
projectAa条目:
applicationData = { 'techSheet': { 'code': "test", 'email': "test", 'TechList': { 'Tech': { 'publicValue': "0", 'privateValue': "0", 'requestedValue': "0", 'TechBudgetList': { 'TechBudget': expenses }, } } }, 'techSheetEvaluation': { 'decisionNumber': '-', 'evaluationStatus': '1', } }
方法2:用Zeep类型构造器传递SkipValue
如果必须保留字段定义(比如某些场景下需要显式跳过),可以通过Zeep的类型构造器来创建复杂类型对象,此时SkipValue会被正确识别:
# 获取对应的复杂类型 TechSheetType = client.get_type('ns0:TechSheet') TechSheetEvaluationType = client.get_type('ns0:TechSheetEvaluation') # 构造对象时传入SkipValue tech_sheet = TechSheetType( code="test", projectAa=zeep.xsd.SkipValue, email="test", TechList={ 'Tech': { 'publicValue': "0", 'privateValue': "0", 'requestedValue': "0", 'TechBudgetList': {'TechBudget': expenses} } } ) tech_sheet_eval = TechSheetEvaluationType( projectAa=zeep.xsd.SkipValue, decisionNumber='-', evaluationStatus='1' ) # 调用服务方法 response = client.service.addTechnicalSheetAndEvaluation( techSheet=tech_sheet, techSheetEvaluation=tech_sheet_eval )
这种方式下,Zeep会正确跳过projectAa字段,不会在XML中生成该属性。
内容的提问来源于stack exchange,提问作者lios
相关产品推荐
相关产品推荐

