zeep.exceptions.Fault:服务器无法处理请求 ---> 未将对象引用设置为对象的实例

问题描述

我正在尝试使用 python 包 zeep 发送请求并接收肥皂服务的响应。 但我不能这样做,我收到此错误消息:

Traceback (most recent call last):
  File "/home/oussama/PycharmProjects/pythonProject/main.py",line 44,in <module>
    res = client.service.addShip(**data)
  File "/usr/local/lib/python3.6/dist-packages/zeep/proxy.py",line 51,in __call__
    kwargs,File "/usr/local/lib/python3.6/dist-packages/zeep/wsdl/bindings/soap.py",line 135,in send
    return self.process_reply(client,operation_obj,response)
  File "/usr/local/lib/python3.6/dist-packages/zeep/wsdl/bindings/soap.py",line 229,in process_reply
    return self.process_error(doc,operation)
  File "/usr/local/lib/python3.6/dist-packages/zeep/wsdl/bindings/soap.py",line 333,in process_error
    detail=fault_node.find("detail"),zeep.exceptions.Fault: Server was unable to process request. ---> Object reference not set to an instance of an object.

这是我的代码

import zeep
client = zeep.Client(wsdl='http://track.smSAExpress.com/SECOM/SMSAwebService.asmx?WSDL')
data = {
    'passKey': 'xxxxxxx','refNo': None,'sentDate': None,'idNo': None,'cName': None,'cntry': None,'cCity': None,'cZip': None,'cPOBox': None,'cMobile': None,'cTel1': None,'cTel2': None,'cAddr1': None,'cAddr2': None,'shipType': None,'PCs': 1,'cEmail': None,'carrValue': None,'carrCurr': None,'codamt': None,'weight': None,'custVal': None,'custCurr': None,'insrAmt': None,'insrCurr': None,'itemDesc': None,'sName': None,'sContact': None,'sAddr1': None,'sAddr2': None,'sCity': None,'sPhone': None,'sCntry': None,'prefDelvDate': None,'gpsPoints': None,}

res = client.service.addShip(**data)
print(res)

您可以在此处 (Link) 找到有关该服务的一些信息

解决方法

我认为 wsdl 的定义与服务器端的实现不同。如果您更改所有可选字段都包含有效值的请求,它将返回一个结果,指出 passKey 不正确。

如果你使用像 SoapUI 这样的模拟工具来模拟服务器端,那么发送一个带有看起来像这样的字典的请求是完全没问题的

data = {'PCs' : 1}

在侧节点中,wsdl 实现了 soap1.1 和 soap1.2,如果您模拟它,请确保使用正确的端点 url,否则您将继续向原始服务器发送数据。

,

zeep Client 对象正在寻找一个字符串并且不喜欢 None 关键字。将 None 更改为 "" 或 ''(即字符串空间),您应该很高兴。

import zeep
client = zeep.Client(wsdl='http://track.smsaexpress.com/SECOM/SMSAwebService.asmx?WSDL')
data = {
    'passKey': 'xxxxxxx','refNo': "",'sentDate': "",'idNo': "",'cName': "",'cntry': "",'cCity': "",'cZip': "",'cPOBox': "",'cMobile': "",'cTel1': "",'cTel2': "",'cAddr1': "",'cAddr2': "",'shipType': "",'PCs': 1,'cEmail': "",'carrValue': "",'carrCurr': "",'codAmt': "",'weight': "",'custVal': "",'custCurr': "",'insrAmt': "",'insrCurr': "",'itemDesc': "",'sName': "",'sContact': "",'sAddr1': "",'sAddr2': "",'sCity': "",'sPhone': "",'sCntry': "",'prefDelvDate': "",'gpsPoints': "",}

res = client.service.addShip(**data)
print(res)