Как передать заголовки SOAP в ПЕНУ Python, которая не определяется в файле WSDL

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

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

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)

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


urn:uuid:43268c01-f09c6
 

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

Спасибо

14
задан chrissygormley 14 September 2015 в 11:07
поделиться

1 ответ

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

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' может быть любым префиксом , например. wsa и u = http: // адрес - это адрес пространства имен.

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

#!/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.

21
ответ дан 1 December 2019 в 12:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: