coro
01.Февраль.2017 12:06:08
1
Здравствуйте!
Имеется следующий код:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from suds.client import Client
from suds.bindings import binding
import logging
time1 = datetime.datetime.strptime("2016-10-01 00:00", "%Y-%m-%d %H:%M");
time2 = datetime.datetime.strptime("2017-01-31 00:00", "%Y-%m-%d %H:%M");
URL = 'http://*/api.asmx?WSDL'
USERNAME = 'USERNAME'
PASSWORD = 'PASSWORD'
# Just for debugging purposes.
logging.basicConfig(level=logging.INFO);
logging.getLogger('suds.client').setLevel(logging.DEBUG);
logging.getLogger('suds.transport.http').setLevel(logging.DEBUG);
binding.envns = ('SOAP-ENV', 'http://www.w3.org/2003/05/soap-envelope');
client = Client(URL);
client.service.Login(USERNAME, PASSWORD);
#print client.service.GetMeasurePointConsumption(1111, time1, time2, "Month");
print client.service.GetNodeListExtended(0);
В GetNodeListExtended получаю не все параметры, хотя тот же самый код на PS возвращает нужные мне данные с точками учета. Пробовал разные переменные, в разных форматах.
Так же пробовал, разные библиотеки pySoap, simplesoap, suds. Помогите, пожалуйста, разобраться. Спасибо!
user30
(Михаил Ключко)
03.Февраль.2017 07:03:38
2
Покажите, что у вас выводится в консоли.
Мы запустили ваш пример и столкнулись с той же проблемой. В методы GetNodeListExtended и GetMeasurePointListExtended нельзя передать параметр (флаг запрашиваемой информации).
Выводится следующее сообщение TypeError: GetNodeListExtended() takes 0 positional arguments but 1 was given.
Хотя метод GetNodeByIdExtended успешно работает, можете использовать его.
coro
03.Февраль.2017 12:43:22
3
С возвратом нет никаких проблем. Он есть, но не полный.
(reply){
ErrorMessage = None
ErrorCode = “None”
NodeList =
(ArrayOfNode){
Node =
(Node){
Id = ****
Title = “**"
Address = " ”
Number = ****
Comment = None
ResponsibleName = None
ResponsiblePhone = None
Type = “Node”
},
(Node){
Использовал разные библиотеки, вводил в качестве параметра уже всё что можно. Победить не удалось. Сделал на request и успокоился.
def object_to_dict(obj):
if isinstance(obj, (str, unicode, bool, int, long, float, datetime.datetime, datetime.date, datetime.time)):
return obj
data_dict = {}
try:
all_keys = obj.__dict__.keys() # vars(obj).keys();
except AttributeError:
return obj
fields = [k for k in all_keys if not k.startswith('_')]
for field in fields:
val = getattr(obj, field);
if isinstance(val, (list, tuple)):
data_dict[field] = []
for item in val:
data_dict[field].append(object_to_dict(item));
else:
data_dict[field] = object_to_dict(val);
return data_dict
def createFromBody(action):
sA = u"""<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>%s
</soap12:Body>
</soap12:Envelope>"""%(action);
return sA
class pyLers:
def __init__(self, url='http://*.*.*.*/api.asmx', login=u'demo', password=u'demo', debug=False):
print('start', datetime.datetime.now());
self.login = login
self.password = password
self.url = url
self.headers = {
'Host': self.url.split('/')[2],
'Content-Type': 'text/xml; charset=utf-8',
}
self.cookies = None
self.Login();
def send_req(self, action, data):
self.headers['SOAPAction'] = action
self.headers['Content-Length'] = str(len(data));
return requests.post(self.url, headers=self.headers, data=data.encode('utf-8'), cookies=self.cookies);
def Login(self):
print('Loing', datetime.datetime.now());
SoapBody = u"""<userName xmlns="http://www.lers.ru/website/api">%s</userName><password xmlns="http://www.lers.ru/website/api">%s</password>"""%(self.login, self.password);
self.headers['SOAPAction'] = 'http://www.lers.ru/website/api/Login'
self.headers['Content-Length'] = str(len(createFromBody(SoapBody)));
req = requests.post(self.url, headers=self.headers, data=createFromBody(SoapBody).encode('utf-8'));
self.cookies = req.cookies
def GetNodeListExtended(self, flags):
print('action_GetNodeListExtended', datetime.datetime.now());
SoapBody = u"""<flags xmlns="http://www.lers.ru/website/api">%s</flags>"""%(flags);
req = self.send_req('http://www.lers.ru/website/api/GetNodeListExtended', createFromBody(SoapBody));
trree = etree.fromstring(req.content);
for a in object_to_dict(trree)[0][0][2]:
print(a[0].text);
pyLers().GetNodeListExtended('Systems')