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