Python使用zeep调用SOAP addShip接口报zeep.exceptions.Fault空引用错误
错误本质
该报错为SMSA SOAP服务端(.NET架构)抛出的空引用异常,与zeep本身的请求逻辑无关,触发原因是服务端处理请求时未获取到必填参数的有效实例,直接对空对象取值导致流程崩溃。
具体解决操作
- 替换占位参数
passKey为官方分配的真实有效密钥,占位符xxxxxxx无法通过服务端身份校验。 - 清理参数字典中所有值为
None的非必填参数,不要带着空值传给接口:zeep默认遇到PythonNone值会直接跳过该字段的序列化,不会在SOAP报文中生成对应节点,服务端对应参数为空就会触发空引用。对于确实不需要传递的可选字段,直接从字典中删除对应键值对,不要保留'xxx': None的写法。 - 按照接口定义补全所有必填参数:这类运单创建接口的必填项通常包括客户参考号
refNo、收件人姓名cName、收件人国家代码cntry、收件人所在城市cCity、收件人联系手机号cMobile、收件人详细地址cAddr1、运输类型shipType、包裹重量weight、物品描述itemDesc,这类参数若全部传None,会直接触发服务端空引用崩溃,必须替换为符合格式要求的实际值。 - 匹配参数格式类型:日期类参数(如
sentDate、prefDelvDate)需要传入Pythondatetime.date对象,不要传字符串或空值;数值类参数(如codAmt、weight、insrAmt)要传入对应数值类型,不要传空值。 - 开启调试日志定位缺漏字段:在初始化zeep客户端时开启DEBUG日志,直接查看实际发送的SOAP报文中缺失的必填节点,逐一对齐接口要求的字段结构:
import logging logging.basicConfig(level=logging.DEBUG) from zeep import Client, Settings # 关闭严格模式减少格式校验误报 settings = Settings(strict=False) client = zeep.Client( wsdl='http://track.smsaexpress.com/SECOM/SMSAwebService.asmx?WSDL', settings=settings )
常见踩坑提示
- 不要为了凑齐参数字典里的所有键就全部设为
None,SOAP接口对缺失节点的容错性很差,尤其.NET架构的服务端遇到未定义的空参数节点,很容易直接抛出空引用异常,不会返回友好的参数校验错误。 - 如果接口要求传空值,不要直接用Python的
None,需要使用zeep根据WSDL生成的对应空值类型对象,避免序列化逻辑异常。
内容的提问来源于stack exchange,提问作者Oussama He
相关产品推荐
相关产品推荐

