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

Python Zeep调用运单生成接口时遭遇Invalid Enum Value枚举值无效错误求助

解决Zeep调用SOAP服务时的枚举序列化问题

我刚踩过类似的Zeep枚举坑,来帮你搞定这个问题!

问题根源

你看到的错误提示已经很明确:服务端无法将'ProductType.Dutiables'反序列化为它定义的SAPI.Entities.Enums.AWBGeneration.ProductType枚举类型。这是因为Zeep处理SOAP枚举时,不需要带枚举类名的前缀,也不能直接传Python Enum对象(除非做特殊处理),服务端只认枚举成员的原始字符串值。

分步解决方案

1. 先确认服务端的枚举定义(关键第一步)

首先得搞清楚服务端到底接受哪些枚举值,别自己瞎猜。用Zeep的客户端元数据来查看:

from zeep import Client

client = Client(url)  # 就是你代码里的那个服务地址
# 替换成服务端枚举的命名空间和类型名,从错误信息里能看到是SAPI.Entities.Enums.AWBGeneration.ProductType
product_type_enum = client.get_type('ns0:ProductType')
print("服务端允许的ProductType枚举值:", product_type_enum.values)

运行这段代码后,你会看到服务端实际接受的字符串列表,比如可能是['Docs', 'Dutiables'],这就是你需要传递的准确值。

2. 直接传递原始字符串值(最简单有效的方法)

修改你的services字典,把ProductType字段改成直接传服务端认可的字符串:

services = {
    "ProductCode": shipping_options['bluedart']['product_code'],
    "ProductType": "Dutiables",  # 这里直接传字符串,不要加ProductType.前缀
    "PieceCount": return_request_line_items.all().count(),
    "ActualWeight": weight,
    "CreditReferenceNo": reference_id,
    "PickupDate": timezone.now() + timezone.timedelta(days=2),
    "PickupTime": '1052',
    "RegisterPickup": True,
    "IsReversePickup": True
}

Zeep会自动把这个字符串映射到对应的SOAP枚举类型,只要值和服务端的EnumMemberAttribute标记的一致。

3. 如果想用Python Enum类(可选)

如果习惯用Enum来管理枚举值,确保你的Enum值和服务端完全匹配,并且传递的时候取.value属性:

from enum import Enum

class ProductType(Enum):
    Docs = "Docs"
    Dutiables = "Dutiables"  # 必须和服务端枚举值完全一致(大小写、拼写都不能错)

# 调用时传入Enum的value属性
services = {
    # 其他字段不变...
    "ProductType": ProductType.Dutiables.value,
    # 其他字段不变...
}

4. 极端情况:用Zeep的枚举构造器包装

如果上面的方法都不行,试试用Zeep提供的枚举类型来构造值:

from zeep import Client

client = Client(url)
# 创建符合服务端类型的枚举实例
product_type = client.get_type('ns0:ProductType')('Dutiables')

services = {
    # 其他字段不变...
    "ProductType": product_type,
    # 其他字段不变...
}

为什么之前的方法失败?

  • 直接传'ProductType.Dutiables':服务端期望的是枚举成员的原始值(比如"Dutiables"),而不是带类名的完整字符串,所以无法反序列化。
  • 直接传ProductType.Dutiables对象:Zeep默认不会自动把Python Enum对象序列化为SOAP枚举类型,必须传递它的原始字符串值。

内容的提问来源于stack exchange,提问作者Debopriyo Das

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:44:04