Oussama He
Oussama He

Reputation: 615

zeep.exceptions.Fault: Server was unable to process request. ---> Object reference not set to an instance of an object

I'm trying to send request and receive the response of a soap service using the python package zeep. But I can't do this, I get this error message:

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.

Here is my code:

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)

Here (Link) you can find some info about the service

Upvotes: 1

Views: 5138

Answers (2)

Puttygutt
Puttygutt

Reputation: 11

The zeep Client object is looking for a string and does not like the None keyword. Change the None to "" or '' (i.e. string space) and you should be good to go.

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)

Upvotes: 1

martijn
martijn

Reputation: 495

I think the definition from the wsdl differs from the implementation on the server side. if you change the request that all optional fields contain a valid value it will return a result stating that the passKey is incorrect.

If you use a mock tool like SoapUI that mocks the server side it is perfectly fine to send a request with the dictionary looking like this

data = {'PCs' : 1}

In a side node the wsdl has both soap1.1 and soap1.2 implemented if you mock it make sure you use the correct endpoint url otherwise you keep sending data to the original server.

Upvotes: 0

Related Questions