zeep.exceptions.XMLSyntaxError: найден корневой элемент html - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь использовать Zeep для отправки SOAP-запроса на сервер Cisco CM для выполнения операции MACD, однако получаю следующую ошибку: zeep.exceptions.XMLSyntaxError: XML-код, возвращаемый сервером, не содержит допустимый {http://schemas.xmlsoap.org/soap/envelope/}Envelope корневой элемент.Обнаружен корневой элемент html

Вот трассировка:

Traceback (most recent call last):
  File "zeepTest.py", line 39, in <module>
    resp = service.listPhone(searchCriteria={'name': 'CIPCDemo1'}, returnedTags={'name':'', 'description':''})
  File "My|project\Path\lib\site-packages\zeep\proxy.py", line 45, in __call__
    kwargs,
  File "My|project\Path\lib\site-packages\zeep\wsdl\bindings\soap.py", line 130, in send
    return self.process_reply(client, operation_obj, response)
  File "My|project\Path\lib\site-packages\zeep\wsdl\bindings\soap.py", line 197, in process_reply
    result = operation.process_reply(doc)
  File "My|project\Path\lib\site-packages\zeep\wsdl\bindings\soap.py", line 392, in process_reply
    % (envelope_qname.namespace, envelope.tag)
zeep.exceptions.XMLSyntaxError: The XML returned by the server does not contain a valid {http://schemas.xmlsoap.org/soap/envelope/}Envelope root element. The root element found is html

Поскольку для этой ошибки не было обращений к SO, я попытался понять zeep \ wsdl \ bindings \ soap.py Я сделал тот же SOAP-запрос к Почтальону, и он работает.Я пробовал другие библиотеки (SUDS), но они не работают, поскольку сервер защищен SSL.

Вот мой код:

from zeep import Client
from zeep.cache import SqliteCache
from zeep.transports import Transport
from zeep.exceptions import Fault
from zeep.plugins import HistoryPlugin
from requests import Session
from requests.auth import HTTPBasicAuth
from urllib3 import disable_warnings
from urllib3.exceptions import InsecureRequestWarning
from lxml import etree

disable_warnings(InsecureRequestWarning)

username = '<axlusername>'
password = '<password>'

host = '<IP address>'

wsdl = r'my/wsdl/file/path'

location = 'https://{host}:8443/axl'.format(host=host)
binding = r"{http://www.cisco.com/AXLAPIService/}AXLAPIBinding"

session = Session()
session.verify = False
session.auth = HTTPBasicAuth(username, password)

transport = Transport(cache=SqliteCache(), session=session, timeout=20)
history = HistoryPlugin()
client = Client(wsdl=wsdl, transport=transport, plugins=[history])
service = client.create_service( binding, location)

def show_history():
    for item in [history.last_sent, history.last_received]:
        print(etree.tostring(item["envelope"], encoding="unicode", pretty_print=True))

resp = service.listPhone(searchCriteria={'name': '<PhoneName'}, returnedTags={'name':'', 'description':''})

print(resp)

Ожидаемые результаты:

<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <ns:getPhoneResponse xmlns:ns="http://www.cisco.com/AXL/API/10.5">
            <return>
                <phone ctiid="91" uuid="{A6A03D42-D167-4F64-BE68}">
                    <name>Phone Name</name>
                    ... data ommited...
                </phone>
            </return>
        </ns:getPhoneResponse>
    </soapenv:Body>
</soapenv:Envelope>     

1 Ответ

0 голосов
/ 24 сентября 2019

Похоже, что в AXL-URL-адресе отсутствует косая черта '/'.Можете ли вы попробовать добавить, то есть:

location = 'https://{host}:8443/axl/'.format(host=host)
...