Для работы с SOAP запросами есть популярная библиотека suds, но с последними версиями питона она не работает. По крайней мере у меня не работает: выскакивают ошибки. Официально suds не поддерживается, и народ лепит fork'и.
Есть новая библиотека для SOAP запросов - Zeep, но материалов по ней мало.
Мне нужно переписать готовый запрос к API Почты России. Он написан с использованием suds, а я хочу переписать запрос под zeep.
from suds.client import Client url = 'https://tracking.russianpost.ru/rtm34?wsdl' client = Client(url,headers={'Content-Type': 'application/soap+xml; charset=utf-8'}) barcode = 'RA644000001RU' #баркод my_login = 'my_login' #логин my_password = 'my_password' #пароль message = \ """<?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:oper="http://russianpost.org/operationhistory" xmlns:data="http://russianpost.org/operationhistory/data" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header/> <soap:Body> <oper:getOperationHistory> <data:OperationHistoryRequest> <data:Barcode>""" + barcode+ """</data:Barcode> <data:MessageType>0</data:MessageType> <data:Language>RUS</data:Language> </data:OperationHistoryRequest> <data:AuthorizationHeader soapenv:mustUnderstand="1"> <data:login>"""+ my_login +"""</data:login> <data:password>""" + my_password + """</data:password> </data:AuthorizationHeader> </oper:getOperationHistory> </soap:Body> </soap:Envelope>""" result = client.service.getOperationHistory(__inject={'msg':message}) sFile = open ("otv.txt",'w') sFile.write(str(result)) sFile.close() for rec in result.historyRecord: print (str(rec.OperationParameters.OperDate)+', '+rec.AddressParameters.OperationAddress.Description+', '+rec.OperationParameters.OperAttr.Name)
Подскажите как это будет выглядеть под zeep? Моих знаний не хватает.
Или что сделать, что suds заработал без ошибок?
Вот что получилось: