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

使用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的必填字段校验:

  1. 修改客户端初始化代码:
from zeep import Client

# 添加strict=False关闭严格校验
client = Client(wsdl="你的WSDL地址", strict=False)
  1. 修改请求数据字典,移除所有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:47:24