zeep.исключения.Ошибка: серверу не удалось обработать запрос. —> Ссылка на объект не установлена для экземпляра объекта

#soap #wsdl #zeep

#soap #wsdl #zeep

Вопрос:

Я пытаюсь отправить запрос и получить ответ службы soap, используя пакет 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)
 

Здесь (ссылка) вы можете найти некоторую информацию о службе

Ответ №1:

Я думаю, что определение из wsdl отличается от реализации на стороне сервера. если вы измените запрос, чтобы все необязательные поля содержали допустимое значение, он вернет результат, указывающий, что пароль неверен.

Если вы используете макет инструмента, такого как SoapUI, который имитирует серверную часть, вполне нормально отправить запрос со словарем, выглядящим следующим образом

 data = {'PCs' : 1}
 

В боковом узле в wsdl реализованы soap1.1 и soap1.2. если вы его имитируете, убедитесь, что вы используете правильный URL конечной точки, иначе вы продолжаете отправлять данные на исходный сервер.

Комментарии:

1. спасибо за ваш ответ, я не имею ни малейшего представления о mocking, и я не знаю, смогу ли я решить эту проблему с его помощью.

2. С помощью инструментов для редактирования вы можете протестировать свой код, чтобы убедиться, что вы соответствуете всем требованиям, которые нужны фактическому серверу. Это поможет вам понять, как работает сервер и какие вопросы вы можете задать владельцу сервера. в этом случае вы можете спросить владельца, какие элементы требуются для отправки вашего запроса, поскольку в wsdl указано, что только PCS является обязательным, но вызов завершается с ошибкой, когда другие элементы не указаны.

Ответ №2:

Клиентский объект zeep ищет строку, и ему не нравится ключевое слово 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)