Конвертер Python SOAP в код?

Мне нужно отправить SOAP envelope, который выглядит именно так...

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:realops.com:amp:workflow" xmlns:oas="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:dst="DST_JC_Sandbox">
    <soapenv:Header>
      <urn:grid-name>GRID01</urn:grid-name>
      <oas:Security>
         <!--Optional:-->
         <oas:UsernameToken>
            <oas:Username>Network</oas:Username>
            <oas:Password>password</oas:Password>
         </oas:UsernameToken>
      </oas:Security>
   </soapenv:Header>
   <soapenv:Body>
      <dst:TrySoap-Request>
         <dst:strInput1>abc</dst:strInput1>
         <dst:strInput2>abc123</dst:strInput2>
      </dst:TrySoap-Request>
   </soapenv:Body>
</soapenv:Envelope>

Я использую Python suds. Но я просто не понимаю, как управлять заголовками. У меня есть только несколько собранных фрагментов, так как я все еще пытаюсь выяснить, как отправить успешный вызов SOAP на мой внутренний тестовый хост (который действительно отвечает на soapUI).

from suds.client import *
from suds.transport.http import HttpAuthenticated
from suds.wsse import *
from suds.xsd.sxbasic import Import
from suds.sax.element import Element    

def main():

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

url = 'http://10.1.1.1:8080/path/name/wsdl?grid-name=GRID01'
client = Client(url, faults=False)
tag_name1 = ('urn', url)
urn = Element('grid-name', ns=tag_name1).setText('GRID01')
client.set_options(soapheaders=urn)
print client.service.TrySoap('abc','123')

Это дает SOAP-оболочку, подобную этой...

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="Sandbox" xmlns:urn="http://10.1.1.1:8080/path/name/wsdl?grid-name=GRID01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header>
      <urn:grid-name>GRID01</urn:grid-name>
   </SOAP-ENV:Header>
   <ns0:Body>
      <ns1:TrySoap-Request>
         <ns1:strInput1>abc</ns1:strInput1>
         <ns1:strInput2>xyz</ns1:strInput2>
      </ns1:TrySoap-Request>
   </ns0:Body>
</SOAP-ENV:Envelope>

Я понимаю, как это работает, только то, что конверт, который я отправляю, должен выглядеть точно так же, как первый образец, который я отправил. Этот запрос не работает, и сервер отвечает "DEBUG:suds.client:http failed:"

Я знаю свой python generated header doesn't match.

Вопросы:

  1. Должен ли мой URL отображаться в заголовке?
  2. Как вложить имя пользователя и пароль в тег UsernameToken?
  3. Правильно ли я построил элемент urn? Или есть лучший способ?
  4. Как мне получить xmlns:urn="urn:realops.com:amp:workflow" в заголовке?
  5. Есть ли conversion tool, где я могу передать ему отформатированный конверт и заставить его выдать код, необходимый Python для формирования этого конверта?

person masadaco    schedule 27.07.2015    source источник


Ответы (1)


Коллега предоставил мне это решение для этого тестового звонка...

from suds.client import Client
from suds.wsse import *
import logging

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

url = 'http://10.1.1.1:8080/file/path/wsdl?grid-name=GRID01'
client = Client(url)
security = Security()
token = UsernameToken('JoeBob','password')
security.tokens.append(token)
client.set_options(wsse=security)
gridns = ('tns','urn:realops.com:amp:workflow')
grid = Element('grid-name',ns=gridns).setText('GRID01')
client.set_options(soapheaders=grid)
result = client.service.TrySoap('abc','123')
print result

Это произвело этот конверт.

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:tns="urn:realops.com:amp:workflow" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="Sandbox" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header>
      <wsse:Security mustUnderstand="true">
         <wsse:UsernameToken>
            <wsse:Username>JoeBob</wsse:Username>
            <wsse:Password>password</wsse:Password>
         </wsse:UsernameToken>
      </wsse:Security>
      <tns:grid-name>GRID01</tns:grid-name>
   </SOAP-ENV:Header>
   <ns0:Body>
      <ns1:TrySoap-Request>
         <ns1:strInput1>abc</ns1:strInput1>
         <ns1:strInput2>123</ns1:strInput2>
      </ns1:TrySoap-Request>
   </ns0:Body>
</SOAP-ENV:Envelope>

Это работает, но я хотел бы понять, почему немного лучше. Я смущен значением тега: формат переменной. Я также не совсем понимаю, как пространство имен было изменено с помощью вызова Element.

person masadaco    schedule 28.07.2015