Конвертор на 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 неуспешно:“

Познавам моето 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