Форум сайта python.su
Здравствуйте.
Для работы с 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)
Офлайн
BinieKOLONНикогда не работал с SOAP или Zeep, интересно было поиграться Вот что получилось:
Подскажите как это будет выглядеть под zeep? Моих знаний не хватает.
from pprint import pprint from zeep import Client BARCODE = 'RA644000001RU' LOGIN = '' PASSWORD = '' client = Client('https://tracking.russianpost.ru/rtm34?wsdl') result = client.service.getOperationHistory( OperationHistoryRequest={'Barcode': BARCODE, 'MessageType': 0}, AuthorizationHeader={'login': LOGIN, 'password': PASSWORD}) pprint(result)
Отредактировано aiscy (Март 7, 2017 14:06:17)
Офлайн
aiscyдля корректного получения ответа необходимо изменить строку создания client:
from pprint import pprint from zeep import Client BARCODE = 'RA644000001RU' LOGIN = '' PASSWORD = '' client = Client('https://tracking.russianpost.ru/rtm34?wsdl', strict=False) result = client.service.getOperationHistory( OperationHistoryRequest={'Barcode': BARCODE, 'MessageType': 0}, AuthorizationHeader={'login': LOGIN, 'password': PASSWORD}) pprint(result)
Офлайн
Настройки передаются через отдельный объект:
1 #!/usr/bin/env python3 2 # -*- coding: utf-8 -*- 3 4 from time import sleep 5 from zeep import Client, Settings 6 7 service_url = 'https://tracking.russianpost.ru/rtm34?wsdl' 8 settings = Settings(strict=False) 9 client = Client(service_url, settings=settings) 10
Отредактировано pavelkim (Июль 19, 2020 06:23:07)
Офлайн