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
相关产品推荐
相关产品推荐

