Найти - Пользователи
Полная версия: SOAP с библиотекой Zeep вместо Suds на Python 3.6
Начало » Python для новичков » SOAP с библиотекой Zeep вместо Suds на Python 3.6
1
BinieKOLON
Здравствуйте.

Для работы с 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 заработал без ошибок?
aiscy
BinieKOLON
Подскажите как это будет выглядеть под zeep? Моих знаний не хватает.
Никогда не работал с SOAP или 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)
nsv1
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)
pavelkim
Настройки передаются через отдельный объект:

     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	

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB