Трябва да изпратя 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
.
Въпроси:
- Трябва ли моят URL да се показва в заглавката?
- Как да вмъкна потребителското име и паролата в таг UsernameToken?
- Правилно ли конструирах елемента
urn
? Или има по-добър начин? - Как да получа
xmlns:urn="urn:realops.com:amp:workflow"
в заглавката? - Има ли
conversion tool
, където мога да му подам форматиран плик и да го накарам да изплюе кода, необходим на Python, за да формира този плик?