Как передать заголовки SOAP в SUDS-Python, которые не определены в файле WSDL

У меня есть камера в моей сети, с которой я пытаюсь подключиться с помощью пены, но пена не отправляет всю необходимую информацию. Мне нужно добавить лишние заголовки мыла, не определенные в файле WSDL, чтобы камера могла понять сообщение. Все заголовки содержатся в конверте SOAP, и тогда команда пены должна быть в теле сообщения.

Я проверил сайт suds, и он говорит, чтобы передать его в заголовки следующим образом: (Это проходит в элементе как заголовок, но у меня есть конверт, поэтому я не уверен, как его ввести)

from suds.sax.element import Element client = client(url) ssnns = ('ssn', 'http://namespaces/sessionid') ssn = Element('SessionID', ns=ssnns).setText('123') client.set_options(soapheaders=ssn) result = client.service.addPerson(person) 

Теперь я не уверен, как это реализовать. Скажем, например, у меня есть следующий заголовок:

 <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP ENC="http://www.w3.org/2003/05/soap-encoding" <wsa:MessageID SOAP-ENV:mustUnderstand="true">urn:uuid:43268c01-f09c6</wsa:MessageID> <SOAP-ENV:Header> 

Используя этот или аналогичный пример, кто-нибудь знает, как передать действительное сообщение SOAP целевой службе?

благодаря

  • Каков наилучший способ изменить текст, содержащийся в файле XML, используя Python?
  • python: xml.etree.ElementTree, удаление "namespaces"
  • python - как писать пустой узел дерева как пустую строку в файл xml
  • Twisted XmlStream: Как подключиться к событиям?
  • Проверка XML (.xsd) на схему
  • XML-анализ Python с веб-сайта
  • Преобразование xml в словарь с помощью ElementTree
  • Разбор SGML с открытыми произвольными метками в Python 3
  • One Solution collect form web for “Как передать заголовки SOAP в SUDS-Python, которые не определены в файле WSDL”

    Я разработал, как вводить новые заголовки и пространства имен в пеной. Как указано выше, вы создаете элемент и передаете его в качестве мыльного устройства так:

     from suds.sax.element import Element client = client(url) ssnns = ('ssn', 'http://namespaces/sessionid') ssn = Element('SessionID', ns=ssnns).setText('123') client.set_options(soapheaders=ssn) result = client.service.addPerson(person) 

    Но если вы хотите добавить пространство имен, которое я нашел, добавление префикса, похоже, должно сделать трюк. Поэтому, когда вы создаете один из элементов, вы добавляете addPrefix . Я не уверен, что это было так, как планировалось, но это работает.

     ssn = Element('SessionID', ns=ssnns).setText('123').addPrefix(p='SOAP-ENC', u='http://www.w3.org/2003/05/soap-encoding') 

    p = 'SOAP-ENC' может быть любым префиксом, eg. wsa eg. wsa и адрес u = http://address – это адрес пространства имен.

    Полный скрипт, который будет запускаться, может быть:

     #!/usr/local/bin/python2.6 import suds #import logging from suds.client import Client from suds.sax.element import Element from suds.sax.attribute import Attribute from suds.xsd.sxbasic import Import def absoluteMove(): # connects to WSDL file and stores location in variable 'client' client = Client('http://10.10.10.10/p.wsdl') client.options.location = 'http://10.10.10.10:32963' # Create the header wsans = ('wsa', 'http://schemas.xmlsoap.org/ws/2004/08/addressing') mustAttribute = Attribute('SOAP-ENV:mustUnderstand', 'true') n1s = ('SOAP-ENC', 'http://www.w3.org/2003/05/soap-encoding') msgId = Element('Element').addPrefix(p='SOAP-ENC', u='http://www.w3.org/2003/05/soap-encoding') msgId2 = Element('Address', ns=wsans).setText('http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous') msgId1 = Element('ReplyTo', ns=wsans).insert(msgId2) msgId1.append(mustAttribute) msgId3 = Element('To', ns=wsans).setText('http://10.10.10.10:32954') msgId3.append(mustAttribute) client.set_options(soapheaders=[msgId, msgId1, msgId3, msgId2]) # Create 'token' object to pass as an argument using the 'factory' namespace token = client.factory.create('ns4:ReferenceToken') # Create 'dest' object to pass as an argument and values passed to this object dest = client.factory.create('ns4:PTZVector') dest.PanTilt._x=1 dest.PanTilt._y=4.9 dest.Zoom._x=1 # Create 'speed' object to pass as an argument and values passed to this object speed = client.factory.create('ns4:PTZSpeed') speed.PanTilt._x=0 speed.PanTilt._y=0 speed.Zoom._x=1 # 'AbsoluteMove' method invoked passing in the new values entered in the above objects try: result = client.service.AbsoluteMove(token, dest, speed) print "absoluteMove result ", result return result except suds.WebFault, e: print "suds.WebFaults caught: " print e if __name__ == '__main__': result = absoluteMove() 

    Это перемещает камеру. Чтобы изменить тип мыльного конверта, проверьте мой следующий вопрос .

    Вы можете добавить запись в этот скрипт, чтобы разрешить вам проверить, какая команда xml вы отправили, что удобно:

     import logging logging.basicConfig(level=logging.INFO) logging.getLogger('suds.client').setLevel(logging.DEBUG) 

    Место может быть помещено в скрипт в качестве опции, если местоположение не находится в файле wsdl.

    Interesting Posts

    Вызов списка () дважды на reverse () возвращает пустой список во второй раз

    связать несколько команд Popen с трубами

    Загрузите цены с помощью python

    Не хотите, чтобы изображения загружались и CSS отображался в Firefox в тестах Selenium WebDriver с помощью Python

    Как я могу запустить команду управления django по заданию cron

    Широковещательная передача с несколькими размерами

    os.mkdir (path) возвращает OSError, когда каталог не существует

    Импорт установленного пакета из сценария повышает значение «AttributeError: модуль не имеет атрибута» или «ImportError: невозможно импортировать имя»,

    Создайте Pandas DataFrame из глубоко вложенного JSON

    Сбой ошибки cythonize

    Обширная документация о том, как написать lexer для Pygments?

    Сравнение строк в Python: vs. ==

    Что такое pythonic способ подсчета ведущих пробелов в строке?

    Внедрение плагиновой системы в Python

    Как я могу сегментировать код для тестирования производительности с помощью Pythons timeit?

    Python - лучший язык программирования в мире.