Уведомления

Группа в Telegram: @pythonsu

#1 Март 6, 2017 15:09:58

BinieKOLON
Зарегистрирован: 2017-03-06
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

SOAP с библиотекой Zeep вместо Suds на Python 3.6

Здравствуйте.

Для работы с 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 заработал без ошибок?

Офлайн

#2 Март 7, 2017 12:00:22

aiscy
Зарегистрирован: 2015-06-17
Сообщения: 52
Репутация: +  9  -
Профиль   Отправить e-mail  

SOAP с библиотекой Zeep вместо Suds на Python 3.6

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)

Отредактировано aiscy (Март 7, 2017 14:06:17)

Офлайн

#3 Янв. 18, 2018 01:49:18

nsv1
Зарегистрирован: 2018-01-18
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

SOAP с библиотекой Zeep вместо Suds на Python 3.6

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)

Офлайн

#4 Июль 16, 2020 15:47:35

pavelkim
Зарегистрирован: 2020-07-16
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

SOAP с библиотекой Zeep вместо Suds на Python 3.6

Настройки передаются через отдельный объект:

     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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version