2010-03-18 24 views
13

Tôi có một máy ảnh trên mạng mà tôi đang cố gắng kết nối với suds nhưng suds không gửi tất cả thông tin cần thiết. Tôi cần phải đặt thêm các tiêu đề xà phòng không được định nghĩa trong tệp WSDL để máy ảnh có thể hiểu được thông báo. Tất cả các tiêu đề được chứa trong một phong bì SOAP và sau đó lệnh suds phải ở trong phần thân của thông báo.Cách chuyển các tiêu đề SOAP vào các thẻ SUDS không được định nghĩa trong tệp WSDL

Tôi đã kiểm tra các bọt website và nó nói để vượt qua trong các tiêu đề như sau: (Điều này đi vào các yếu tố như một tiêu đề nhưng tôi có một phong bì vì vậy tôi không chắc chắn làm thế nào để đầu vào này)

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) 

Bây giờ, tôi không chắc chắn làm thế nào tôi sẽ thực hiện điều này. Ví dụ: tôi có tiêu đề bên dưới:

<?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> 

Sử dụng ví dụ này hoặc ví dụ tương tự có ai biết cách tôi chuyển thông điệp SOAP hợp lệ đến dịch vụ được nhắm mục tiêu không?

Cảm ơn

Trả lời

20

Tôi đã tìm hiểu cách nhập các tiêu đề và không gian tên mới trong phần mềm. Như đã trình bày ở trên, bạn tạo một Element và vượt qua nó như một SOAPHeader như vậy:

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) 

Nhưng nếu bạn muốn thêm một namespace Tôi đã tìm thấy thêm một tiền tố dường như để làm các trick. Vì vậy, khi bạn tạo một trong các yếu tố bạn thêm addPrefix. Tôi không chắc đây có phải là cách nó được dự định thực hiện hay không nhưng nó hoạt động.

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

Các p = 'SOAP-ENC' thể được bất kỳ tiền tố eg. wsau = http://address là địa chỉ của không gian tên.

Một kịch bản hoàn chỉnh mà có thể chạy có thể là:

#!/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() 

này di chuyển camera. Để thay đổi loại kiểm tra phong bì xà phòng my next question.

Bạn có thể thêm ghi vào kịch bản này whci cho phép của bạn để kiểm tra những gì lệnh xml bạn đã gửi mà là tiện dụng:

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

Các vị trí có thể được đưa vào kịch bản như một tùy chọn nếu địa điểm không có trong tệp wsdl.

Các vấn đề liên quan